簡體   English   中英

C++ - 刪除雙向鏈表中的節點會導致分段錯誤

[英]C++ - Deleting a node in doubly linked list causes a segmentation fault

我正在嘗試按位置刪除一個節點,下面代碼中的行刪除項導致了段錯誤,我一直試圖解決這個問題,但我無法解決。 這是刪除方法:

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;
}

你的算法有一些問題。 這里有一些更正,並附有一些小的評論,以指出更正。

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更改為正確的單元格 - 下一個項目。

您應該花一些時間在紙上繪制鏈表並驗證不變量。 如果您繪制不同的案例,您將對第二個案例進行解釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM