![](/img/trans.png)
[英]Why does NULL Pointer check not work while iterating through singly-linked list in C?
[英]Singly-linked list insertion in C (pointer to pointer)
单链表插入函数有两个版本。
一种是使用一个指针的常见版本,很容易理解:
void insert(struct node *newt) {
struct node *node = head, *prev = NULL;
while (node != NULL && node->data < newt->data) {
prev = node;
node = node->next;
}
newt->next = node;
if (prev == NULL)
head = newt;
else
prev->next = newt;
}
另一种是使用指向指针的指针:
void insert(struct node *newt)
{
struct node **link = &head;
while (*link && (*link)->data < newt->data)
link = &(*link)->next;
newt->next = *link;
*link = newt; //confuse me
}
我对*link = newt;
感到困惑虽然我给*link赋值了newt,但是之前的节点还是指向了原来的地址?
先感谢您!
在前面插入节点时,必须更新列表的头部。 之后插入时,必须更新上next
节点的next
字段。 使用指向节点指针的指针可以做到:
首先:
struct node **link = &head;
现在link
是指向头指针的指针。 如果更新*link
,则会通过该指针更新头部。
之后:
link = &(*link)->next;
现在link
是指向当前节点next
字段的指针。 如果您更新*link
,则会更新next
字段。
在这两种情况下,如果您从*link
读取,您将获得当前节点。
上一个节点还是指向原来的地址?
在*link = newt;
它将newt
分配给前一个节点的next
成员。
link
要么指向head
要么指向前一个节点的next
成员。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.