gpt4 book ai didi

c++ - 链表离开递归函数后丢失节点

转载 作者:行者123 更新时间:2023-11-30 04:37:23 25 4
gpt4 key购买 nike

struct Letter {
char let;
Letter *next;
};

请看下面的 addLETTERS() 函数。

int main() {
Letter *Top = 0;
Letter *head = 0;
char letters = 'a';
head = new Letter;
Top = new Letter;

MakeNull(head);
MakeNull(Top);
addLETTERS(Top, head,letters);
return 0;
}

void MakeNull(Letter *newNode){

newNode = new Letter;
newNode->let = 0;
newNode->next = 0;
}

出于某种奇怪的原因,当离开这个函数时,我的链表丢失了所有它创建的节点?使用 GDB 我可以清楚地看到函数正在运行并将整个字母表添加到列表中。有人可以运行这个简单的代码并告诉我为什么吗?

struct Letter *addLETTERS(Letter *Top, Letter *head, char& letters) {

if(letters != 'z' + 1){
Top = new Letter;
Top->let = letters++;
Top->next = head;
head = Top;
addLETTERS(Top,head,letters);

}
else {
Top->let = '\0';
Top->next = head;
head = Top;
}


return Top;
}

最佳答案

从这里开始:

int main() {
Letter *Top = 0;
Letter *head = 0;
char letters = 'a';

MakeNull(&head);
MakeNull(&Top);
addLETTERS(Top, head,letters);
return 0;
}

void MakeNull(Letter **newNode){

*newNode = new Letter;
(*newNode)->let = 0;
(*newNode)->next = 0;
}

基本上,如果你这样做:

void MakeNull(Letter *newNode) {
newNode = new Letter;
//...

...您正在传递一个地址,该地址包含在(指针)变量“newNode”(该函数的本地变量)中 - 但随后您立即为该变量分配了一个新值。传入值是没有用的。修改函数的该值的本地拷贝不会修改您用来传入该值的主函数中的指针变量。

所以我对其进行了修改,以便您传入指针变量的地址 - 一个“双指针”。这样就可以在main函数中修改指针变量的内容了。

您的“addLetters”函数也会出现同样的问题:您正在传递一个您在函数内部修改的地址(head)——但这不会修改您传入的变量 who 的值。

关于c++ - 链表离开递归函数后丢失节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3836394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com