2016-03-30 13 views
0

循環的な二重リンクリストを実装しようとしていますが、セグメンテーションフォルトが継続しています:11エラー(これは追加機能と削除機能によるものだと思います。私のコードが近いのかどうかはわかりませんが、正しくテストするためにこのエラーを越えることはできません。これは私が私が関与していると信じていることを持っているコードです:すべてのヘルプは、おかげで素晴らしいだろう円二重リンクリスト - セグメンテーションフォールト:11

(Circular_DLList.cc)

void Circular_DLList::add_to_tail(int a) 
{ 
    if (is_empty()) { 
     tail = new DLLNode(a); 
     tail->next = tail; 
    } 
    else { 
     tail->next = new DLLNode(a, tail->next); 
    } 
} 

int Circular_DLList::delete_from_tail() 
{ 
    if(!is_empty()) 
    { 
     int a = tail->info; 
     tail = tail->prev; 
     tail->next = null; 
     return a; 
    } 
    else 
    { 
     tail = 0; 
    } 
    return a; 
} 

+3

クラッシュ(セグメンテーション・フォルトなど)が発生した場合は、デバッガを実行して「動作中」のクラッシュをキャッチする必要があります。これにより、デバッガはクラッシュの場所で停止し、変数の値と関数呼び出しスタックを調べることができます。デバッガがコードで停止しない場合は、コードに達するまで呼び出しスタックを上げます。 –

+3

'p->!= tail'はコンパイルされませんので、実際のコードを投稿してください。 –

+1

投稿のガイドラインに従って、最小限の例を抽出してください。それはあなたが問題に集中するのを助けるはずです。つまり、あなたはいわゆる3つの法則(またはC++ 11の5つの法則)を破ってしまったと言いました。 –

答えて

1

セグメント違反を見つける1つの方法は、コード全体でcoutステートメントを使用し、コンパイルして実行することです。 cout文が何かをコンソールに出力すると、セグメンテーションフォールトはcout文の後の行で起こります。セグメント化エラーのある行がどこにあるかを特定して絞り込むには、これを続けます。

1

コードに複数の問題がありますが、ここに1つあります。

あなたが最初の要素を追加するときは、実行します(:nullptrの代わり0を使用BTW)

tail = new DLLNode(a); 
    tail->next = tail; 

をあなたは0に等しいprevを残します。

あなたはその要素を削除した場合、あなたが実行します。

int a = tail->info; 
    tail = tail->prev; // tail becomes 0 
    tail->next = null; // Dereference 0 cause seg fault 
    return a; 

がところで:あなたの削除機能も DLLNodeを削除する必要があります!ポインタ値を変更するだけでは不十分です。

だから、これは3つの変化をもたらす:新しい要素を追加するとき

1)常に両方nextprev

2を設定してください)新しい

で作成DLLNodeを削除することを忘れないでください3)削除機能では、リストに正確に1つの要素が含まれているかどうかを確認する特別なケースが必要です。つまり、if (tail == tail->next) { .. delete last element .. set tail equal nullptr}