2010-10-01 48 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; 
}