1

要素を循環的な二重リンクリストに挿入し、これらの要素を表示するコードを記述しました。私はまた、特定の要素のリストを検索するだけでなく、リストからテールノードを削除することができるはずです。円二重リンクリストからノードを削除する

これは、アドオンや印刷のための私の作業コードです:

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

void Circular_DLList::print_list() 
{ 
    DLLNode *ptr; 
    ptr = tail->next; 
    do { 
     cout<< ptr->info << endl; 
     ptr = ptr->next; 
    } 
    while(ptr != tail->next); 
} 

は、どんなに私がdelete_from_tail機能のために書かれたものは、それがセグメンテーションフォールトが発生していない:11。これは私の関数の試行(エラーをスローする)です。

int Circular_DLList::delete_from_tail() 
{ 
    int a = tail->info; 
    if(tail == tail->next) { 
     delete tail; 
     tail = NULL; 
    } 
    else { 
     tail = tail->prev; 
     delete tail->next; 
     tail->next = NULL; 
    } 
    return a; 
} 

これを修正する方法についてのアドバイスは素晴らしいと思います。私はデバッグしようとしましたが、私は問題を解明していないようです。 ありがとう

+0

を? –

+0

@UsamaZafarはい、私たちはtailと呼ばれるノードを使っていますので、簡単に言っていました。投稿を編集して明確にします – btoohey

+0

削除自体にエラーが発生していますか?私は推測していない。私は削除権利の後に印刷されていると思いますか? –

答えて

0

あなたがそれをよく見ると、問題はかなり明白です。あなたの削除機能は、リンクリストの循環チェーンを壊しています。どうして?あなたが実際にバグであるので、チェーンを壊したtail->next = NULLを設定しているelse-condition

int Circular_DLList::delete_from_tail() 
{ 
    int a = tail->info; 
    DLLNode *temp; 

    if(tail == tail->next) { 
     delete tail; 
     tail = NULL; 
    } 
    else { 
     tail = tail->prev; 
     delete tail->next; 
     tail->next = NULL; 
    } 
    return a; 
} 

:以下、あなたの削除機能を参照してください。したがって、printが呼び出されると、循環チェーンは元のままであるとみなされ、誤ってNULLポインタにアクセスしようとします。これはセグメンテーション違反につながります。

修正は、以下のコードを参照非常に簡単です:あなたは、円形のリンクリストの概念が終わり権を持っていないし、実際にあることを知っている

int Circular_DLList::delete_from_tail() 
{ 
    int a = tail->info; 
    if(tail == tail->next) { 
     delete tail; 
     tail = NULL; 
    } 
    else { 
     temp = tail; 
     tail = tail->prev; 
     tail->next = temp->next;  // To maintain the circular chain 
     tail->next->previous = tail; // Since this element's previous also point to the node about to be deleted 
     delete temp; 
     temp = NULL; 
    } 
    return a; 
} 
+0

どうもありがとう、どうもありがとうと思いますが、どうもありがとうございました。それは完全に動作します! – btoohey

+0

@boooheyうれしかったよ。 –

関連する問題