c - 下面的 LinkedList 代码有什么问题?

标签 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已经创建并初始化

最佳答案

你的间接性混淆了。让我们看看这里发生了什么。你有这个功能:

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/

相关文章:

c++ - 方法超出范围后是否应该删除引用的 std::shared_ptr ?

c - 尝试使用 const 初始化变量时出现错误 "initializer element is not constant"

algorithm - 通过用 bmw 替换它来最小化最大 hundai

c - 链表 - 在 C 中的链表末尾插入一个节点

c - 如何使用列表项的 glib 函数释放内存

无法创建结构列表

c - 如何从静态库中删除 C 文件和其他元数据的路径

c - 如何扩展makefile来编写库?

c - 如何从 pcap 文件恢复数据?

C - 大括号和双指针内的指针