2010-10-01 56 views
1
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;  
} 
+0

@ codeulike:为什么retag?这不是C代码。 – 2010-10-01 15:31:34

+0

对不起,当我标记它没有语言标签,所以我有一个猜测:S – codeulike 2010-10-01 16:21:01

回答

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'(对函数来说是局部的),但是你立即为变量赋值一个新的值。传递价值是无用的。修改函数的该值的本地副本不会修改您用来传递该值的主函数中的指针变量。

所以我修改它,让你通过指针变量的地址 - 一个'双指针'。这样,您可以修改主函数中指针变量的内容。与你的“addLetters”功能发生

同样的问题:你传递你的函数内部修改地址(头) - 但不会改变谁是你传入值的变量

+0

太好了,非常感谢你的帮助。 – trentonknight 2010-10-01 13:22:12

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 = Top 
+0

非常感谢。我会尝试这种方法。 – trentonknight 2010-10-01 13:23:12

0

非常重要非常感谢您安德斯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; 
}