私は、リニアリンクリストの配列全体を表示するための再帰的なソリューションに取り組んでいます。これは宿題ではありませんが、テストの準備として、私は来ています。リニアリンクリストの配列を表示するための再帰的解答
現在のところ、私はいくつかのセグメンテーション違反を持っていますが、その理由はわかりません。私はこのコードのポインタ比較セクションに問題があると感じています。
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);
}
がなぜこのように複雑になっている
head[size-1]
_head[size-1]
にメンバー_head
にhead
名前を変更し、変更しやすいようですか?あなたは**リニアリンクリスト**を簡単に実装することができ、その配列を作ることができます。 あなたが実装した方法は間違っています。あなたがOOPsのやり方でそれを作りたければ。まず、**リニアリンクリスト**を作成しておき、リンクリスト**をその上に実装する必要があります(__は線形リンクリストクラス__を継承します)。 –このコードはインストラクターによってあらかじめ書かれていますが、私はまったく別の方法でそれを行うでしょう。 –
あなたはその問題自体に言及する必要があります。 –