从斯坦福大学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如何通过它后面的那个连接? 或者我完全误读了这个解决方案......
答案 0 :(得分:1)
pp
是指向指针的指针,所以在这一行[{1}}中你指定了pp = &curr->next;
指针的地址(不是它自己的下一个元素的地址)保存下一个元素的地址,所以稍后,在这里pp
你'输入'存储下一个元素的地址的房间,并用*pp = newNode;
的地址替换它。
答案 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)