2013-11-26 31 views
-1

我試圖遞歸地打印我的列表,但我遇到了麻煩。輸出是無限2 ....... 2 .....直到我的電腦崩潰。打印LinkedList遞歸地使用C++第2部分

我的遞歸函數如下:

//void List::PrintListRecursively() 
void List::PrintListRecursively(){ 

    if (curr==NULL) 
    { 
     cout << "\n"; 
     return; 
    } 
    cout << curr->data <<endl; 
    PrintListRecursively(); 
} 

我的主要功能如下:

int main() 
{ 
    List myList; 


    myList.insertAtTail(2); 
    myList.insertAtTail(3); 
    myList.insertAtHead(0); 
    myList.insertAtHead(-1); 
    myList.insertAtHead(-2); 
    myList.PrintListRecursively(); 

} 

我原來的遞歸函數是下面的代碼,但我不知道怎麼傳因爲它是一個void函數,所以它是原始函數的參數。該函數不一定是無效的,我只是不知道如何將指針傳遞給函數,特別是遞歸。遞歸總是讓我失望。

void List::PrintListRecursively(){ 

    if (curr==NULL) 
    { 
     cout << "\n"; 
     return; 
    } 
    cout << curr->data <<endl; 
    PrintListRecursively(curr->next); 
} 

有人建議:

void List::PrintListRecursively(Node* curr) 

,因爲我使用的typedef:typedef結構節點* NODEPTR; 我嘗試這樣做:

void List::PrintListRecursively(nodePtr curr) 

但我得到這個錯誤:聲明是無效列表:: PrintListRecursively不相容

請幫助

+0

做你的聲明和定義匹配'PrintListRecursively'? –

+0

這個問題與你的[其他問題]幾乎相同(http://stackoverflow.com/questions/20226797/print-linkedlist-recursively-using-c) - 請堅持現有的問題。 – user4815162342

回答

2

I just get this error: Declaration is incompatible with void List::PrintListRecursively

你的聲明和定義必須匹配結束。您可以保留不帶參數的公共函數,然後提供第二個實現。因此,您的聲明看起來是這樣的:

class List { 
    //... 
    public: 
     void PrintListRecursively(); 

    private: 
     void PrintListRecursively(nodePtr curr); 
}; 

而且定義:

void List::PrintListRecursively(){ 
    PrintListRecursively(head); 
} 

void List::PrintListRecursively(nodePtr curr) { 
    if (curr==NULL) 
    { 
     cout << "\n"; 
     return; 
    } 
    cout << curr->data <<endl; 
    PrintListRecursively(curr->next); 
} 
+0

非常感謝 – Will

1

你的第二個版本具有正確的想法,提前到遞歸調用之前的下一個列表元素,但沒有正確實現它。由於PrintListRecursivelyList本身上定義(與接收 a List實例相反),所以前進的正確方法是通過在下一個元素上調用方法,不帶參數。

換句話說,你的第二個實施需要與cur->next->PrintListRecursively();

+0

我很確定,在這個實現中,列表節點不包含列表函數。名單本身似乎在做所有的工作。 – paddy

+0

@paddy好點。考慮到'PrintListRecursively'的調用,我假設了一個C型列表,其中列表*是頭節點。但是這顯然與'insertAtHead'和'insertAtTail'方法的存在相矛盾,這表明'List'中有一個「tail」和「head」。如果確實如此,遞歸實現將需要一個輔助函數,如答案中所述。 – user4815162342