我试图在链表末尾附加一个节点,但该节点无法工作,因为我希望没有错误,但我无法弄清楚我哪里出错了,请帮忙。
void attachEnd(node **hptr, node *newnode)
{
if (*hptr == NULL)
{
*hptr = newnode;
}
else
{
while ((*hptr)->next != NULL)
{
(*hptr) = (*hptr)->next;
}
(*hptr)->next = newnode;
}
}
主要内容:
attachEnd(&head, newnode);
假设newnode已经创建并初始化
最佳答案
你的间接性混淆了。让我们看看这里发生了什么。你有这个功能:
void attachEnd(node **hptr, node *newnode)
{
if (*hptr == NULL)
{
*hptr = newnode;
}
else
{
while ((*hptr)->next != NULL)
{
(*hptr) = (*hptr)->next;
}
(*hptr)->next = newnode;
}
}
现在,我们假设您将 head
初始化为 NULL
,并尝试添加一些节点:
node *head = NULL;
attachEnd(&head, newnode1);
因为**hptr == NULL
当您进入该函数时,您分配了新节点的值,然后退出。所以当你返回时,head
的值为newnode1
。
接下来,添加另一个节点:
attachEnd(&head, newnode2);
在您的 attachEnd
函数中,*hptr
不是 NULL
,因此您执行 else
子句。不过,(*hptr)->next == NULL
,因此您只需将newnode2
分配给(*hptr)->next
即可。一切都好。
问题出现在下一次通话中。现在列表中有两项,因此您进入 while
循环。您要做的第一件事是:
(*hptr) = (*hptr)->next;
请记住,由于您使用指向 head
的指针(本身就是一个指针)调用了 attachEnd
,因此您所做的相当于
head = head->next;
并且您已经丢失了 head
之前的值。
您需要一个中间变量来跟踪事物,这样您就不会覆盖head
:
void attachEnd(node **hptr, node *newnode)
{
if (*hptr == NULL)
{
*hptr = newnode;
return;
}
node *ptr = *hptr;
while (ptr->next != NULL)
{
ptr = ptr->next;
}
ptr->next = newnode;
}
关于c - 下面的 LinkedList 代码有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48189612/