c - 修改并返回指向结构的指针
问题描述
我正在研究一个 LIFO 堆栈结构,实现为单链表:
typedef struct spile {
char ch;
struct spile *address;
} Spile, *Pile;
我想编写一个推送函数,它将一个元素(char)添加到列表的头部。
为什么这样的事情会导致核心转储:
Pile add_head (Pile P, char c) {
P->address = P;
P->ch = c;
return P ;
}
虽然类似的功能(这次删除 head 元素)有效?
Pile remove_head (Pile P) {
P = P->adress;
return P;
}
我知道我可以这样处理:
#define MALLOC(t) ((t*)malloc(sizeof(t)))
Pile add_head (Pile P, char c) {
Pile P1 = MALLOC(Spile);
P1->address = P;
P1->ch = c;
return P1;
}
但我希望函数修改 P 而不是返回新指针。此外,由于我没有在任何地方释放(P1),如果我没记错的话,上面的版本会导致内存泄漏。
编辑: add_head 是这样调用的
Pile my_pile = NULL;
my_pile = add_head(my_pile, 'z');
当我说我想修改 add_head 中的参数 P 时,我的意思是 P 应该由函数返回,但其中包含新元素。
解决方案
我希望 (
add_head
) 函数修改 P 而不是返回新指针。
如果要向结构中添加新元素,则需要为这个新元素分配内存。
如果这个新元素应该被添加到列表的头部,那么头部指针将改变到新的位置。
Old List with A,B,C
___ ___ ___ ______
| A | --> | B | --> | C | --> | NULL |
|___| |___| |___| |______|
Head
New List after adding element D
___ ___ ___ ___ ______
| D | --> | A | --> | B | --> | C | --> | NULL |
|___| |___| |___| |___| |______|
Head
您编写的第二个函数(带有malloc
)是必要的。
推荐阅读
- angular - 当应用程序关闭时,如何使用 NativeScript 处理推送通知?
- ios - iOS,UIScrollView 中的第一页启用横向,第二页禁用横向
- vba - 如何根据用户输入增加 MS Access 报表或表单中输入框的大小?
- spring-boot - LettuceConnectionFactory对redis和springboot是否有版本限制?
- javascript - 切换最近的 div 位置
- android - 如何在 Android 上使用 OpenCV 中的 WLSDisparityFilter 和 ximgproc?
- android - RecycleView 在底部得到削减
- c++ - 循环中的随机函数
- c++ - C++ 解引用指针。为什么会发生这种变化?
- android - 如何有意图地在whatsapp中打开特定号码的对话