我试图按位置删除一个节点,下面代码中的行删除项会导致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;
}
答案 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
更改为正确的单元格 - 下一个项目之后。
您应该花一些时间在纸上绘制链接列表并验证不变量。如果您绘制不同的案例,您将对第二种案例有解释。