【发布时间】:2016-03-04 06:13:02
【问题描述】:
我正在尝试编写一些代码来从循环双向链表中删除一个节点。我编写了以下函数,它主要工作:
bool Circular::remove(int index)
{
if (head == NULL)
return false;
Node* current;
current = head;
if (index > 0)
{
for (int i = 0; i < index; i++)
{
current = current->next;
}
}
else if (index < 0)
{
for (int i = 0; i < abs(index); i++)
{
current = current->prev;
}
}
if (current == head)
{
head = current->next;
}
else if (current == tail)
{
tail = current->prev;
}
current->prev->next = current->next;
current->next->prev = current->prev;
return true;
}
我唯一的问题是,当我将数字 1 传递给索引号时,它不会删除正确的值。相反,它总是删除尾部。如果您认为我的代码在其他地方有问题,那么我也会调查一下。
【问题讨论】:
-
处理链表的好方法是笔和纸。绘制节点。画出所有的链接。一个接一个地,并且一次在多个地方没有链接点,将链接更改为所需的配置。编码您必须采取的步骤。还要花一些时间学习使用系统的调试器。当您可以逐行观看程序运行时,可以加快解决问题的时间。
-
你能给出一个显示错误的完整测试用例吗?
-
另外,您的
remove方法会泄漏内存;它删除指针但从不删除节点。 -
即使这意味着问题中有更多代码,您也应该提供将项目添加到列表中的函数;如果向列表中添加某些内容出错,删除也可能出错,并且仅从
remove代码无法检测到错误。
标签: c++ doubly-linked-list circular-list