为了学习,我正在写一个简单的链表实现我的链表由包含node
值的int
结构和指向下一个节点的指针组成。当我运行我的代码时,它会无休止地循环,即使它在到达空指针时应该终止我做错什么了?
#include <stdio.h>
struct node {
int value;
struct node *next_node;
};
struct node * add_node(struct node *parent, int value)
{
struct node child;
child.value = value;
child.next_node = NULL;
parent->next_node = &child;
return parent->next_node;
}
void print_all(struct node *root)
{
struct node *current = root;
while (current != NULL) {
printf("%d\n", current->value);
sleep(1);
current = current->next_node;
}
}
int main()
{
struct node root;
root.value = 3;
struct node *one;
one = add_node(&root, 5);
print_all(&root);
}
最佳答案
您的程序显示未定义的行为:您正在此处设置指向本地分配的struct
的指针:
struct node child;
child.value = value;
child.next_node = NULL;
parent->next_node = &child;
return parent->next_node;
由于
child
在堆栈上,因此返回指向它的父级将导致未定义的行为。您需要动态分配
child
以使其工作:struct node *pchild = malloc(sizeof(struct node));
// In production code you check malloc result here...
pchild->value = value;
pchild->next_node = NULL;
parent->next_node = pchild;
return parent->next_node;
既然已经动态分配了内存,请不要忘记在链接列表的每个动态分配节点上调用
free
,以防止内存泄漏。关于c - 链接列表无限循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18291793/