我正在尝试在链接列表的末尾添加一个节点,但是节点没有工作,因为我希望没有错误,但我无法弄清楚我哪里出错了请帮助。
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
答案 0 :(得分:1)
你的间接混淆了。我们来看看这里发生了什么。你有这个功能:
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;
请记住,因为您使用指向attachEnd
(它本身就是指针)的指针调用了head
,所以您所做的相当于
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;
}
答案 1 :(得分:0)
void attachEnd(node **hptr, node *newnode)
{
/* There MUST be a NULL pointer somewhere in the chain
** Either at the beginning (an empty list)
** , or at the end
*/
for ( ;*hptr; hptr = &(*hptr)->next) {;}
// Once you get here *hptr willbe NULL
*hptr = newnode;
}