繁体   English   中英

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM