删除双链表中的节点不起作用
Deleting node in a double linked list is not working
这是一个基本函数,它获取一个迭代器位置并删除该位置的节点,但它给我一个运行时错误。我做错了什么?
iterate erase(iterate position)
{
iterate i;
Node<T>* temp = head;
if (head == NULL) {
cout << "empty list" << endl;
}
else if (position.pointer == head) {
head = temp->next;
temp->next->previous = NULL;
delete position.pointer;
}
else {
while (temp != NULL) {
if (temp == position.pointer->previous) {
temp->next = position.pointer->next;
temp->next->previous = temp;
i.pointer = temp->next;
delete position.pointer;
return i;
}
}
}
您的函数缺少足够的 return
语句。有多个流程可以导致函数退出,但只有其中一个有return
语句。因此 return 值在很大程度上将是 不确定的 ,导致任何尝试使用 return 值的调用者出现 未定义的行为 .
在任何情况下,您的 while
循环都会永远迭代,因为您不会在循环的每次迭代中更新 temp
。如果 position
指向列表中的最后一个节点,您也有一个 NULL 指针取消引用,因为在访问 temp->next->previous
.
之前您没有检查新的 temp->next
是否为 NULL
但是,您真的根本不需要 while
循环 。关于 double 链表的事情是,给定列表中的 any 节点,你有 direct 访问两侧围绕它的节点。因此无需迭代列表寻找节点。
尝试更像这样的东西:
iterate erase(iterate position)
{
Node<T> *temp = position.pointer;
if (!temp) return end();
Node<T> *next = temp->next;
Node<T> *previous = temp->previous;
if (next) next->previous = previous;
if (previous) previous->next = next;
if (temp == head) head = next;
//if (temp == tail) tail = previous;
delete temp;
iterate i;
i.pointer = next;
return i;
}
或者:
iterate erase(iterate position)
{
Node<T> *temp = position.pointer;
if (!temp) return end();
Node<T> *dummy; // <-- only if no tail ...
Node<T> **previous = (temp->next) ? &(temp->next->previous) : &dummy/*&tail*/;
Node<T> **next = (temp->previous) ? &(temp->previous->next) : &head;
*previous = temp->previous;
*next = temp->next;
delete temp;
iterate i;
i.pointer = *next;
return i;
}
这是一个基本函数,它获取一个迭代器位置并删除该位置的节点,但它给我一个运行时错误。我做错了什么?
iterate erase(iterate position)
{
iterate i;
Node<T>* temp = head;
if (head == NULL) {
cout << "empty list" << endl;
}
else if (position.pointer == head) {
head = temp->next;
temp->next->previous = NULL;
delete position.pointer;
}
else {
while (temp != NULL) {
if (temp == position.pointer->previous) {
temp->next = position.pointer->next;
temp->next->previous = temp;
i.pointer = temp->next;
delete position.pointer;
return i;
}
}
}
您的函数缺少足够的 return
语句。有多个流程可以导致函数退出,但只有其中一个有return
语句。因此 return 值在很大程度上将是 不确定的 ,导致任何尝试使用 return 值的调用者出现 未定义的行为 .
在任何情况下,您的 while
循环都会永远迭代,因为您不会在循环的每次迭代中更新 temp
。如果 position
指向列表中的最后一个节点,您也有一个 NULL 指针取消引用,因为在访问 temp->next->previous
.
temp->next
是否为 NULL
但是,您真的根本不需要 while
循环 。关于 double 链表的事情是,给定列表中的 any 节点,你有 direct 访问两侧围绕它的节点。因此无需迭代列表寻找节点。
尝试更像这样的东西:
iterate erase(iterate position)
{
Node<T> *temp = position.pointer;
if (!temp) return end();
Node<T> *next = temp->next;
Node<T> *previous = temp->previous;
if (next) next->previous = previous;
if (previous) previous->next = next;
if (temp == head) head = next;
//if (temp == tail) tail = previous;
delete temp;
iterate i;
i.pointer = next;
return i;
}
或者:
iterate erase(iterate position)
{
Node<T> *temp = position.pointer;
if (!temp) return end();
Node<T> *dummy; // <-- only if no tail ...
Node<T> **previous = (temp->next) ? &(temp->next->previous) : &dummy/*&tail*/;
Node<T> **next = (temp->previous) ? &(temp->previous->next) : &head;
*previous = temp->previous;
*next = temp->next;
delete temp;
iterate i;
i.pointer = *next;
return i;
}