无法理解sortedlinklist函数

时间:2014-04-13 09:24:32

标签: c data-structures linked-list

从斯坦福大学CS库中找到了一些问题,这个问题如下

编写一个SortedInsert()函数,该函数给出一个按递增顺序排序的列表,以及一个 单个节点,将节点插入列表中的正确排序位置。 Push() 分配一个新节点添加到列表中,SortedInsert()接受一个现有节点,并且只是 重新排列指针以将其插入列表中。有很多可能的解决方案 问题

我找到了一个有趣的解决方案,我很难理解

void SortedInsert(struct node** headRef, struct node* newNode) {
    struct node **pp, *curr;

    pp = headRef;
    while ((curr = *pp) != NULL && curr->data <= newNode->data)
        pp = &curr->next;
    *pp = newNode;
    newNode->next = curr;
}

有人可以向我解释这是如何运作的吗? 据我所知,curr设置为* pp(headRef),curr在while循环中设置为* pp,然后检查当前节点是否小于要插入的节点,然后将pp设置为下一个节点目前的一个。 让我感到震惊的是,当条件失败并跳转到

*pp = newNode;
newNode -> next = curr;

因为curr在while循环中重置为* pp,newNode如何通过它后面的那个连接? 或者我完全误读了这个解决方案......

3 个答案:

答案 0 :(得分:1)

pp是指向指针的指针,所以在这一行[{1}}中你指定了pp = &curr->next; 指针的地址(不是它自己的下一个元素的地址)保存下一个元素的地址,所以稍后,在这里pp你'输入'存储下一个元素的地址的房间,并用*pp = newNode;的地址替换它。

enter image description here

答案 1 :(得分:0)

简化版:

void SortedInsert(struct node **headRef, struct node *newNode) {

        for ( ; *headRef && (*headRef)->data <= newNode->data; headRef = &(*headRef)->next)
            {;}

           /* When we arrive here, headRef points to the ->next pointer
           ** that points to the node that should come after the newNode
           ** , OR it points to the terminal ->next pointer,
           ** which will be NULL.
           ** In the case of an empty list, *headRef will be NULL, and
           ** the loop is never entered.
           */
        newNode->next = *headRef;
        *headRef = newNode;
}

答案 2 :(得分:0)

你提到了:

“因为curr在while循环中重置为* pp,newNode如何通过它后面的那个连接?或者我完全误读了这个解决方案......”

实际上'curr'会在循环开始时保持分配给(新的,更新的)pp,如代码所示:

while ((curr = *pp) != NULL && curr->data <= newNode->data)
    pp = &curr->next;

(cur == * pp)不仅用于启动,还为每个循环执行.. 并且pp也会继续前进到列表中的下一个项目(pp =&amp; curr-&gt; next),直到列表的末尾(* pp == NULL)