[英]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.