0

我正在尝试将一个项目添加到链接列表的末尾,或者如果链接列表为空,则只需添加一个项目。

到目前为止我有

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;

那么代码看起来如何?任何帮助找出问题所在将不胜感激。

4

6 回答 6

2

这行不通

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

你需要这个:

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

你让它 curr 的方式是一个指向新元素的局部变量,并随着函数返回而消失。你永远不会跟踪一个新的。

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

于 2013-07-17T01:14:24.063 回答
1

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

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

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

于 2013-07-17T01:13:27.087 回答
0
while(curr->next == NULL)

应该

while(curr->next != NULL)
于 2013-07-17T01:13:01.873 回答
0

需要进行一些更改:

  1. 在您检查的情况下,您还需要更新 headcurr == NULL

  2. while循环应该是while (curr->next != NULL)

于 2013-07-17T01:13:46.997 回答
0

这不会去任何地方,你从头开始,如果那不是空的,那么你说“继续前进,而下一个是空的”。如果 next 不为空,您仍将保持领先。

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

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 永远不会被初始化。

你可以通过在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
    }

其余的保持不变。

于 2013-07-17T01:15:16.947 回答
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;

请注意,在这种方法中,您不再需要任何分支。无论您是在列表的开头、中间还是末尾添加新元素,它都能正常工作。

于 2013-07-17T02:52:53.903 回答