【问题标题】:Linked List Losing nodes after leaving recursive function离开递归函数后链表丢失节点
【发布时间】:2010-10-01 03:38:14
【问题描述】:
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;    
}

【问题讨论】:

  • @codeulike:为什么要重新标记?那不是 C 代码。
  • 对不起,当我标记它时没有语言标签所以我猜了:S

标签: c++ recursion linked-list


【解决方案1】:

从这里开始:

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”函数也会出现同样的问题:您传入的是在函数内部修改的地址(头) - 但这不会修改您传入的变量值。

【讨论】:

    【解决方案2】:

    除了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 传递

    *head = Top
    

    【讨论】:

    • 非常感谢。我会试试这个方法。
    【解决方案3】:

    最重要的是非常感谢 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2018-12-01
      • 1970-01-01
      • 2015-05-24
      • 2023-03-26
      • 2020-03-28
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多