2016-10-23 17 views
-4

ノードの位置を削除しようとしています。下のコードの行削除アイテムがsegフォルトを引き起こしています。しばらくの間、私は断った。ここ は、removeメソッドです:C++ - 二重リンクリストのノードを削除すると、セグメンテーションフォールトが発生する

void* List::remove(long index){ 
    if(index > this->size-1){ 
    return NULL; 
    } 
    else { 
    long i = 0; 
    List::ListItem *item = this->head; 

    while(i <= this->size-1){ 
     if(index == 0){ 
      item->getNext()->setPrev(NULL); 
      this->head = item; 
      this->size--; 
      delete item; 
      break; 
     } 

     else if(indexOf(item->getData()) == index){ 
      item->getPrev()->setNext(this->head->getNext()); 
      item->getNext()->setPrev(this->head->getPrev()); 
      this->size --; 
      break; 
     } 
     else { 
      item = item->getNext(); 
      i++; 
     } 
    } 
} 
return NULL; 
} 
+1

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

+0

また、このアルゴリズムはリンクリストの実装では追加する価値がありません。何のリストではない。 – DeiDei

+0

@DeiDeiアルゴリズムに何が問題なのですか?より正確にお願いしますか? –

答えて

0

あなたのアルゴリズムは、いくつかの問題があります。ここでいくつかの訂正と、訂正を指摘するための小さなコメントがあります。

void/* * */ List::remove(long index){ 
    if(index > this->size-1){ 
    return /* NULL */; 
    } 
    else { 
    long i = 0; 
    List::ListItem *item = this->head; 

    while(i <= this->size-1 && i <= index /* new */){ 
     if(index == 0){ 
      item->getNext()->setPrev(this->head->getPrev() /* NULL */); 
      this->head->getPrev()->setNext(item->getNext()); // new 
      this->head = item->getNext(); 
      this->size--; 
      delete item; 
      break; 
     } 
     else if(indexOf(item->getData()) == index){ 
      item->getPrev()->setNext(item /* this->head*/ ->getNext()); 
      item->getNext()->setPrev(item /* this->head */ ->getPrev()); 
      this->size --; 
      break; 
     } 
     else { 
      item = item->getNext(); 
      i++; 
     } 
    } 
} 
return /* NULL */; 
} 

index == 0の場合に発生します。あなたのリストは常にitemで始まり、itemでも削除されます。このような場合には、this->headを右のセルに変更する必要があります。

リンクされたリストを紙に描画し、不変量を検証するにはしばらく時間がかかることがあります。異なるケースを描くと、2番目のケースの説明があります。

+0

先生は私たちにクラスダイアグラムをくれました。私はそれを実装しています。 –

関連する問題