将项目添加到链接列表的末尾

时间:2013-07-17 01:07:47

标签: c linked-list

我正在尝试将项目添加到链接列表的末尾,或者只是在链接列表为空时添加项目。

到目前为止我已经

struct node* curr=head;
struct node* newnode=malloc(sizeof(struct node));

newnode->data=item;
newnode->next=NULL;
if (curr == NULL){
    curr=newnode;
}
else {
    while(curr->next == NULL){
        curr=curr->next;
    }
    curr->next=newnode;
}
return 1;

那么代码看起来如何?任何帮助搞清楚什么是错的都将不胜感激。

6 个答案:

答案 0 :(得分:2)

这不起作用

if (curr == NULL){
   curr=newnode;}

你需要这个:

if (curr == NULL){
   head=newnode;}

你有curr的方式是一个指向新元素的局部变量,并且返回函数返回。你永远不会跟踪一个新的。

正如其他人所说,你需要在循环中!=

答案 1 :(得分:1)

我发现有一件事看起来很奇怪

while(curr->next == NULL){
     curr=curr->next;}

怀疑你想要在没有一个节点的情况下进入下一个节点。你可能想要的是条件!=,而不是==

答案 2 :(得分:0)

while(curr->next == NULL)

应该是

while(curr->next != NULL)

答案 3 :(得分:0)

需要进行一些更改:

  1. 如果您检查curr == NULL

  2. ,您还需要更新头部
  3. while循环应为while (curr->next != NULL)

答案 4 :(得分:0)

这不会去任何地方,你从头开始,如果那不是空的那么你说“继续下去是空的”。如果下一个不是空的,你仍然会留在头上。

要在列表末尾添加,您需要以下内容:

else
{
    while(curr->next != NULL) // keep going while curr->next is not null
    {
        curr = curr->next; // advance the pointer
    }
    // Here curr->next will definitely be null
    curr->next = newnode; // now point curr->next to the new node
}

有人已经指出,在第一次检查中curr == NULL的情况下,一旦执行了赋值,就不会返回指针,并且头部永远不会被初始化。

你可以通过在这个函数范围之外声明head,或者在函数签名中有一个指向指针的方式来逃避它,例如:

int add_node(struct node** head) // I'll assume this is how you've declared your add function
                     // ^^  notice the pointer to pointer
{
    struct node* curr = *head; // curr assignment changes slightly
    struct node* newnode = malloc(sizeof(struct node));
    newnode->data = item;
    newnode->next = NULL;
    if (curr == NULL)
    {
        *head = newnode; // this will dereference the pointer to the pointer and update head without returning anything
    }

其余的保持不变。

答案 5 :(得分:0)

这可能是学习双指针习语的好机会,这对于执行链表的扫描修改非常有用。在您的情况下将是

struct node *newnode, **pnext;

newnode = malloc(sizeof *newnode);
newnode->data = item;
newnode->next = NULL;

for (pnext = &head; *pnext != NULL; pnext = &(*pnext)->next);

*pnext = newnode;

请注意,在此方法中,您不再需要任何分支。无论您是在列表的开头,中间还是结尾添加新元素,它都可以统一运行。