在这个链表插入的实现中,作者使用双指针将链表传递给方法。
我不明白他为什么不用单指针。你能解释一下使用双指针的原因吗?
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
仍将指向同一个节点。但是,如果您将指针传递给该指针,您将能够修改它(第一个函数就是这种情况)。