我正在尝试将我的删除功能用于双向链表。我觉得我的代码是正确的,但它一直在破碎。我相信当我删除节点时它有一些事情要做,但我不确定编译器是否一直把我带到throw.cpp?所以我不太清楚什么是错的。这是我的代码:
ItemType remove(int index)
{
ItemType name;
Node* temp;
Node* current;
int pos = 0;
int endpos = size - 1;
if (index >= 0 && index <= size)
{
if (index == 0)
{
temp = head;
delete head;
head = temp->next;
size--;
name = temp->info;
return name;
}
else if (index == size - 1)
{
temp = tail;
delete tail;
tail = temp->prev;
size--;
name = temp->info;
return name;
}
else if (index <= size/2)
{
current = head;
while (pos != index)
{
current = current->next;
pos++;
}
}
else if (index > size/2)
{
current = tail;
while (endpos != index)
{
current = current->prev;
endpos--;
}
}
}
temp = current;
current->prev->next = current->next;
current->next->prev = current->prev;
delete current;
size--;
name = temp->info;
return name;
}
如果有人能看到可能会出现问题的问题。
答案 0 :(得分:1)
错误是什么?
有些建议,在删除头部和尾部时,先将新的头/尾指针设置为先删除旧指针。所以代码
temp = head;
delete head;
head = temp->next;
应改为
temp = head;
head = temp->next;
delete temp;
为尾巴做同样的事情。这是因为当您致电delete head
时,与temp
指向同一位置的head
现在具有垃圾值,因此您不能在后续使用temp->next
命令。
同样在调用name = temp->info
时,请确保它在删除变量之前。
答案 1 :(得分:0)
以下是一些更正
而不是
if (index >= 0 && index <= size)
使用
if (index >= 0 && index < size)
您正在更新指针之前删除节点,这就是崩溃的原因。所以首先你需要更新头指针然后删除temp。喜欢这个
temp = head;
head = head->next;
delete temp;
同样适用于删除尾指针
temp = tail;
tail = tail->next;
delete temp;
此处删除临时非当前
temp = current;
current->prev->next = current->next;
current->next->prev = current->prev;
delete temp;
并使用
name = current->info;