C++ C++;链表递归问题

C++ C++;链表递归问题,c++,recursion,linked-list,C++,Recursion,Linked List,我在理解以下代码块时遇到一些问题: void InsertSorted(Entry * & list, Entry * newOne) { if (list == NULL || newOne->name < list->name) { newOne->next = list; list = newOne; } else { InsertSorted(list->next, newOne);

我在理解以下代码块时遇到一些问题:

void InsertSorted(Entry * & list, Entry * newOne) {
    if (list == NULL || newOne->name < list->name) {
        newOne->next = list;
        list = newOne;
    } else {
        InsertSorted(list->next, newOne);
    }
}
void InsertSorted(条目*&list,条目*newOne){
if(list==NULL | | newOne->namename){
新建一个->下一个=列表;
list=newOne;
}否则{
InsertSorted(列表->下一步,新建一个);
}
}
我尝试跟踪代码,但只找到了第一条if语句。一旦我执行了第一个if语句,我就不明白以前对InsertSorted的调用是如何将列表的前面部分连接到新创建的列表的


谢谢

这是插入排序,项目将根据顺序插入列表中的位置。一旦到达列表的末尾,或者在列表中找到项目应该位于的位置,递归就会结束


请注意,对于每个递归调用,您在列表中前进一个链,列表指针的“头”基本上在列表中移动。

这是插入排序,项目将根据顺序插入列表中的位置。一旦到达列表的末尾,或者在列表中找到项目应该位于的位置,递归就会结束


请注意,对于每个递归调用,您在列表中前进一个链,列表指针的“头”基本上会在列表中移动。

基本上,如果列表的开头位置正确,此代码会在列表的开头插入新元素,否则,它会向下移动,并将下一个元素视为“开始”


关键是列表指针是通过引用传递的,所以当我们说“list=newOne”时,它实际上在调用者的作用域中起作用。因此,当我们调用“InsertSorted(list->next,newOne)”时,它实际上可以更新我们的列表。

基本上,如果列表的开头位置正确,这段代码会在列表的开头插入新元素,否则,它会向下移动,并将下一个元素视为“开始”

newOne->next = list;
关键是列表指针是通过引用传递的,所以当我们说“list=newOne”时,它实际上在调用者的作用域中起作用。因此,当我们调用“InsertSorted(list->next,newOne)”时,它实际上可以更新我们的列表

newOne->next = list;
将新列表节点的下一个字段设置为当前列表的前面

list = newOne;
设置跟踪列表前面(称为“列表”)的指针,以指向列表中的第一个新节点newOne

仅当列表为空时,才会出现上述情况。else条件沿着列表遍历一个节点,直到找到列表中的最后一个节点,这由if语句条件控制

由于参数是通过引用传递的(如“&”字段所示),因此函数内部所做的更改在程序中的任何地方都会保持不变

将新列表节点的下一个字段设置为当前列表的前面

list = newOne;
设置跟踪列表前面(称为“列表”)的指针,以指向列表中的第一个新节点newOne

仅当列表为空时,才会出现上述情况。else条件沿着列表遍历一个节点,直到找到列表中的最后一个节点,这由if语句条件控制


由于参数是通过引用传递的(如“&”字段所示),因此函数内部所做的更改在程序中的任何地方都会保留。

要理解此函数,只需绘制每次调用所获得的数据即可

假设您有一个这样的列表(假设名称是一个
int
):

您想插入
5

在第一次调用时,
list
通过原始调用者指针引用
1
。也就是说,如果您这样做:

InsertSorted(myList, someNode);
函数内部的
列表
指函数外部的
myList
,在函数内部更改它会在函数外部更改它。现在,if条件没有通过,因为
list
不是
NULL
newOne->name
不是
name
。因此,函数使用
list
next
指针和
newOne
调用自身。我们现在的处境是:

1 -> 4 -> 6 -> 7 -> 10 -> NULL
^ list refers to this one

5
^ this is newOne, floating off somewhere by itself
1 -> 4 -> 6 -> 7 -> 10 -> NULL
     ^ list refers to this one through 1's next pointer

5
^ this is newOne, floating off somewhere by itself
在下一次调用中,
list
指的是上次调用的
list->next
,这意味着它指的是
4
。如果
不满意,则再次调用
,因此我们继续执行
else
:使用
list->next
再次调用函数(请记住
list
现在指的是
4
,这使得
list->next
在此调用中指的是
6
)。我们现在的处境是:

1 -> 4 -> 6 -> 7 -> 10 -> NULL
^ list refers to this one

5
^ this is newOne, floating off somewhere by itself
1 -> 4 -> 6 -> 7 -> 10 -> NULL
     ^ list refers to this one through 1's next pointer

5
^ this is newOne, floating off somewhere by itself
在下一次调用中,
list
指的是
4
next
指针,它表示
6
。下面是列表的内容:

1 -> 4 -> 6 -> 7 -> 10 -> NULL
          ^ list refers to this one through 4's next pointer

5
^ this is newOne, floating off somewhere by itself
这一次,
如果满足(因为5<6),那么我们

  • 使
    newOne->next
    指向
    list
    。这使得表示
    5
    的新节点指向
    6
    作为它的
    下一个
    节点

  • list
    设置为
    newNode
    。这可能会让人困惑,但请记住,
    list
    是一个引用,这意味着更改它会更改原始文件。当
    list
    引用
    4
    时,原来是
    list->next
    ,因此这与将指向
    4
    next
    指针的节点设置为指向
    newOne
    相同

  • 5 -> 7 -> 9 -> NULL
    
    这意味着列表现在如下所示:

    1 -> 4 -> 5 -> 6 -> 7 -> 10 -> NULL
              ^ here's newOne
    
    5 -> NULL
    
    7 -> 9 -> NULL
    
    5
    ^ newOne
    
    函数不做任何调用,因此函数终止,控制返回到最初调用它的函数

    您刚刚按排序顺序插入了新元素

    您需要考虑以下三种情况:

  • 列表为空(
    list==NULL
    立即)
  • 要插入的图元比所有现有图元都小
  • 正在插入的元素是
    newOne->next = list;
    list = newOne;