以下LinkedList代码有什么问题?

时间:2018-01-10 14:28:08

标签: c data-structures singly-linked-list

我正在尝试在链接列表的末尾添加一个节点,但是节点没有工作,因为我希望没有错误,但我无法弄清楚我哪里出错了请帮助。

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

2 个答案:

答案 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;
}