为了学习,我正在写一个简单的链表实现我的链表由包含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/

10-13 05:09