C++ 链表在离开递归函数后丢失节点

C++ 链表在离开递归函数后丢失节点,c++,recursion,linked-list,C++,Recursion,Linked List,请查看下面名为addLETTERS()的函数 出于某种奇怪的原因,在离开此函数时,我的链接列表会丢失其所有创建的节点吗?使用GDB,我可以清楚地看到函数正在工作,并将整个字母表添加到列表中。有人能运行这个简单的代码并告诉我原因吗? int main() { Letter *Top = 0; Letter *head = 0; char letters = 'a'; head = new Letter; Top = n

请查看下面名为addLETTERS()的函数

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

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;
}

从这里开始:

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;
}
…您正在传递一个地址,该地址包含在(指针)变量“newNode”(该变量是函数的本地变量)中,但随后您将立即为该变量分配一个新值。传递值是无用的。修改该值的函数的本地副本不会修改用于传入该值的主函数中的指针变量

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


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

除了sje397所指出的,请查看结束条件

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

最重要的是,非常感谢Anders K和sje397!我用了你的两个例子,并且成功了!下面是函数代码。GBD显示在my函数之外传递的所有内容及其打印输出

*head = Top
intmain(){
字母*Top=0;
字母*头=0;
字符字母='a';
头=新字母;
Top=新字母;
MakeNull(&head);
MakeNull(&Top);
添加字母(顶部和头部,字母);
打印链接列表(头);
返回0;
}
void MakeNull(字母**newNode){
*newNode=新字母;
(*newNode)->let=0;
(*newNode)->next=0;
}
结构字母*添加字母(字母*顶部,字母**头部,字符和字母){
如果(字母!=“z”+1){
Top=新字母;
Top->let=字母++;
顶部->下一步=*头部;
*头部=顶部;
添加字母(顶部、头部、字母);
}
返回顶部;
}
结构字母*打印链接列表(字母*顶部){
如果(顶部!=0){
不能让下一个;
printLinkedList(顶部);
}
返回顶部;
}

非常感谢。我要试试这个方法。@codeulike:为什么要重新标记?这不是C代码。对不起,当我标记它时,没有语言标记,所以我猜:s
struct Letter *addLETTERS(Letter *Top, Letter *head, char& letters) {
...
    else {
        Top->let = '\0';
        Top->next = head;
        head = Top;           <--- this will do nothing
    }

   return Top;    
}
*head = Top
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);
    printLinkedList(head);
    return 0;
}

void MakeNull(Letter **newNode){

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

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);
    }

    return Top;

}

struct Letter *printLinkedList(Letter *Top){

    if(Top != 0){
    cout << Top->let << endl;
    Top = Top->next;
    printLinkedList(Top);
    }

    return Top;
}