2017-07-21 4 views
-2

私は、リニアリンクリストの配列全体を表示するための再帰的なソリューションに取り組んでいます。これは宿題ではありませんが、テストの準備として、私は来ています。リニアリンクリストの配列を表示するための再帰的解答

現在のところ、私はいくつかのセグメンテーション違反を持っていますが、その理由はわかりません。私はこのコードのポインタ比較セクションに問題があると感じています。

1 2 3 4 5 
5 4 3 2 1 
1 3 2 4 5 
2 4 3 1 5 
size is: 4 

私はすべてのリストとワンセグを表示していました:私は範囲外つもりで、例えば、 は、私は私の機能を表示していました

List1 - 1 2 3 4 5 
List2 - 5 4 3 2 1 
List3 - 1 3 2 4 5 
List4 - 2 4 3 1 5 
の4つのリスト

を持っていた何が起こっているようだ しかし、私はその理由がわからないので、私が持っている唯一の合理的な疑惑は、ポインタの比較をチェックするコードのセクションを指しています。私は頻繁にスタックのオーバーフローに投稿することはありませんので、フォーマットの問題がある場合は、私に指示してください。

//simple struct with int data 
struct node 
{ 
    int data; 
    node* next; 
} 

//table class has: 
//array of linear linked lists 
//size of array 
class table 
{ 
public: 
/* 

assume constructors and destructors are properly implemented 

*/ 

    void display(); 
    void displayArr(node** head); 
    void traverse(node* head); 

    private: 
    void traverseLLL(node* head); 
    void displayArr(node** head); 

    node** head; 
    int size; 
} 

//wrapper 
void table::display() 
{ 
    displayArr(head); 
} 

//takes in array of pointer 
void table::displayArr(node** head) 
{ 

    //if no array 
    if(!head) return; 

    if(*head == head[size-1]) //pointer comparison, check bounds 
    { 
    //enter block, on last index 
    cout << "size is: " << size << endl; 
    traverse(*head); //do this 
    return; //get out 
    } 
    else //not on last index 
    { 
    traverse(*head); //display 
    ++head; //increment index 
    displayArr(head); //recursive call 

} 

//traverse to the end of a LLL and displays it 
void table::traverse(node* head) 
{ 
    if(!head) return; 

    cout << head->data << endl; 

    traverse(head->next); 
} 
+0

がなぜこのように複雑になっているhead[size-1]_head[size-1]にメンバー_headhead名前を変更し、変更しやすいようですか?あなたは**リニアリンクリスト**を簡単に実装することができ、その配列を作ることができます。 あなたが実装した方法は間違っています。あなたがOOPsのやり方でそれを作りたければ。まず、**リニアリンクリスト**を作成しておき、リンクリスト**をその上に実装する必要があります(__は線形リンクリストクラス__を継承します)。 –

+0

このコードはインストラクターによってあらかじめ書かれていますが、私はまったく別の方法でそれを行うでしょう。 –

+0

あなたはその問題自体に言及する必要があります。 –

答えて

2

問題はhead[size-1]です。再帰中にheadポインタが移動されたことを覚えておく必要があります。

head以外の別の名前をdisplayArrに使用すると、リストの実際のヘッドを記録するクラスメンバーheadを上書きしないようにすることができます。

まあ、

+0

見つけた、ありがとう!私は変数の名前を変更してチェックしました: if(* array == head [size-1]) そしてsegフォールトはありません! –

関連する問題