一个是使用一个指针的常见版本,很容易理解:
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;
感到困惑。尽管我将newt分配给*链接,但上一个节点仍然指向原始地址?
提前谢谢!
在前面插入节点时,必须更新列表的头。之后插入时,必须更新上一个节点的next
字段。使用指向节点的指针可以做到这一点:
最初:
struct node **link = &head;
现在link
是指向头指针的指针。如果更新*link
,则通过该指针更新头部。
稍后:
link = &(*link)->next;
现在link
是指向当前节点的next
字段的指针。如果更新*link
,则更新该next
字段。
在这两种情况下,如果从*link
读取,则会得到当前节点。
上一个节点仍然指向原始地址?
在*link = newt;
中,它将newt
分配给上一个节点的next
成员。
CCD_ 13指向CCD_ 14或指向前一节点的CCD_。