2016-11-27 11 views
1

これは、要素itemを持つノードを削除するための私の削除関数です。私はsegフォルトが発生していると私はかなり確信しているので、temp - > prevはフロントセンチネルなので、技術的には二重リンクリストにはない。それが正しいのであれば、どうすればこれを防ぐことができますか?どんな助けもありがとう。二重リンクリストのノードを削除する(C++)

編集:ただ、コードを更新しましたが、それでもあなたはwhile()ループを使用してノードがリストノードを通過したいワンセグ障害と

void list::remove(const list_element & item) 
{ 
    list_node* temp = _front; 
    for (int i = 0; i < _size; i++) 
    { 
     if (temp -> next -> data == item) 
     { 
     if (temp -> prev == _front) 
     {  
      _front = temp -> next; 
     } 
     else if (temp -> next == _rear) 
     {  
      temp -> prev -> next = _rear; 
     } 
     else 
     { 
      temp -> prev -> next = temp -> next; 
      temp -> next -> prev = temp -> prev; 
     } 
    } 
     delete temp; 
    } 
} 
+0

あなたの開発環境に付属しているはずのデバッガであなたの疑惑を確認することをお勧めします。デバッガは、今まで発見したことのない最高のプログラミング生産性のツールである可能性が高いので、他のものに費やす時間が長くなればなるほど、すぐに使用できるようになります。 – user4581301

+0

つまり、次のノードを調べて削除する必要があるかどうかを確認してから、現在のノードを削除しているようです。 – user4581301

答えて

0

を出てきます。 _frontがセンチネルであるため、nextまたはprevノードが先頭か末尾かを明示的にチェックする必要はありません。

void list::remove(const list_element& item) { 
    list_node* current = _front; 
    while (current->next != nullptr) { 
    if (current->next->data == item) { 
     current->next = current->next->next; 
     if (current->next != nullptr) { 
     delete current->next->prev; 
     current->next->prev = current; 
     } 
     break; 
    } 
    current = current->next; 
    } 
    // update pointer to rear if it changed 
    if (current->next == nullptr) 
    _rear = current; 
} 
+0

しかし、センチネルは_frontポインタだけではありませんか? –

+0

@MikeLandryいいえ、 'sentinel-> next'はリンクリストの先頭(正面)です。センチネルは削除/挿入/ルックアップのようなものを簡単にするためのダミーノードです。なぜなら、 ' - > next 'ポインタを持っているかどうか心配する必要がないからです。実際のリンクされたリストの前に常に存在します。 – 0x499602D2

+0

@MikeLandryリストの先頭を指しているリンクリストクラスの中に 'list_node * sentinel'があると仮定しました(' sentinel-> next == _front') – 0x499602D2

関連する問題