2016-09-09 81 views
3

我試圖用遞歸方式在鏈表中的每個節點上打印數據,但是我越界了,所以我認爲我的遞歸函數有問題。遞歸地打印一個列表

這裏的頭文件:

class List 
{ 
public: 
    void print(std::ostream &out) const {} 
private: 
    Node *head; 
    void printList(std::ostream&, const Node*) const; 
} 

基本上,我是從公共print函數調用的私人助手功能。下面是兩個函數的代碼:

void List::print(std::ostream& out) const 
{ 
    printList(out, head); 
} 

void List::printList(std::ostream& out, const Node* n) const 
{ 
    if(n->next == NULL) { 
     out << n->data << std::endl; 
     return; 
    } 

    out << n->data << std::endl; 

    printList(out, n->next); 
} 

我認爲問題出在我的if塊,因爲我需要停下來,如果沒有下一個節點,也是返回前打印在當前節點的數據,但由於我已在printList(out, n->next)末尾撥打n->next,我是否需要在我的if區塊中執行此操作?

有遞歸執行此操作的更好方法嗎?代碼是否適用於其他人?我似乎無法得到它的工作。

+0

我寧願寫'無效列表::的printList(STD :: ostream的進出,常量節點* N)const的 { 如果(N == NULL){ 回報; } out << n-> data << std :: endl; printList(out,n-> next);爲簡單起見, –

+0

您確定在創建節點時將節點的'next'指針初始化爲空指針嗎?或者至少確保列表中最後一個節點的'next'指針是空指針? –

+0

在基本情況下是否正確將'n-> next'設置爲'nullptr'?或者它是一個隨機的,未初始化的地址? – RyanP

回答

5

您需要更改if()中的條件。您應該檢查當前節點是否爲NULL而不是下一個節點。

void List::printList(std::ostream& out, const Node* n) const { 
    if(n == NULL) { 
     return; 
    } 
    out << n->data << std::endl; 
    printList(out, n->next); 
} 
+0

這有幫助。這實際上更有意義,哈!謝謝! – WitchKing17