c - 为什么作者在这个链表插入操作中要使用双指针呢?

标签 c pointers linked-list

<分区>

在这个链表插入的实现中,作者使用双指针将链表传递给方法。

我不明白他为什么不用单指针。你能解释一下使用双指针的原因吗?

void insert_list(list **l, item_type x)
{
    list *p; /* temporary pointer */
    p = malloc( sizeof(list) );
    p->item = x;
    p->next = *l;
    *l = p;
}

换句话说,下面的实现会出现什么问题?

void insert_list(list *l, item_type x)
{
    list *p; /* temporary pointer */
    p = malloc( sizeof(list) );
    p->item = x;
    p->next = l;
    l = p;
}

最佳答案

请注意,list** l 是指向list 的指针。语句 p->next = *l 表示 p->next 指向节点 **l。然后我们修改指针*l指向p;我们可以这样做,因为我们传递了一个指向指针的指针。

这是列表发生的变化(以图形方式):

... -> some_node -> ...

我们在 l 之前插入一个项目为 x 的新节点:

... -> new_node -> some_node -> ...

这段代码的好处在于,它避免了一些如果您没有得到指向指针的指针就会出现的情况。它更干净。

你给的代码,

void insert_list(list *l, item_type x)
{
    list *p; /* temporary pointer */
    p = malloc( sizeof(list) );
    p->item = x;
    p->next = l;
    l = p;
}

接收指向节点的指针的副本;这意味着它不能修改变量(即它只能进行“本地”更改)。当函数返回时,l 仍将指向同一个节点。但是,如果您将指针传递给该指针,您将能够修改它(第一个函数就是这种情况)。

关于c - 为什么作者在这个链表插入操作中要使用双指针呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36617400/

相关文章:

c - sed 匹配一个组并在重用之前修改该组

c - 方括号内的指针?

c - 将数组的内存分配给 char 指针

java - 为什么我不能在链表上使用 DescendingIterator?

sorting - 自然mergesort链表

c - 将相同的信息发送到多个线程/套接字?

c - Windows 中的返回约定

c++ - 打印链表的问题

python - 尝试在 macOS 上使用 pip 安装任何东西,但不能

perl - 对相等字符串的引用