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;