链接列表离开递归函数后丢失节点

时间:2010-10-01 03:38:14

标签: c++ recursion linked-list

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

3 个答案:

答案 0 :(得分:2)

这是开始的地方:

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函数中的指针变量。

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

你的'addLetters'函数会出现同样的问题:你传入一个你在函数内部修改的地址(头部) - 但这不会修改你传入的值的变量。

答案 1 :(得分:0)

另外sje397指出,看看结束条件

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',你需要把它作为**头传递

*head = Top

答案 2 :(得分:0)

最重要的是非常感谢Anders K和sje397!我使用了你的两个例子并让它发挥作用!这是功能代码。 GBD显示在我的功能之外传递的所有内容及其打印输出。

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