2016-09-09 10 views
3

再帰を使用してリンクリストの各ノードにデータを印刷しようとしていますが、範囲外のエラーが発生しているため、再帰関数に問題があると思います。リストを再帰的に印刷する

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

は基本的に、私は公共のprint関数からプライベートヘルパー関数を呼び出しています:

は、ここでヘッダファイルです。ここでは、2つの関数のコードは次のとおりです。

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); 
} 

私は私は次のノードが存在しない場合に停止するだけでなく、返す前に、現在のノードのデータを印刷しますが、以来、する必要があるため、問題は、私の場合はブロック内にあると思います私はすでにprintList(out, n->next)の末尾にn->nextと呼んでいます。私はifブロックでそれをする必要がありますか?

再帰的に行うより良い方法はありますか?コードは他の誰のためにも使えますか?私はそれを働かせるように見えません。

+0

私はむしろ '無効リストを記述します::がprintlist(STD :: ostreamに&アウト、constのノード* 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

関連する問題