C ++ - 删除双向链表中的节点会导致分段错误

时间:2016-10-23 15:17:11

标签: c++ linked-list segmentation-fault doubly-linked-list

我试图按位置删除一个节点,下面代码中的行删除项会导致seg错误,我一直试图解决这个问题,但是我没有说明。 这是删除方法:

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 个答案:

答案 0 :(得分: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更改为正确的单元格 - 下一个项目之后。

您应该花一些时间在纸上绘制链接列表并验证不变量。如果您绘制不同的案例,您将对第二种案例有解释。