为什么"delete"关键字不删除节点?

Why isn't "delete" keyword deleting the node?

本文关键字:节点 删除 关键字 delete 为什么      更新时间:2023-10-16

我已经实现了一个双向链表。问题是删除具有特定值的节点。为此,我首先必须在列表中找到该值。如果它存在,我必须删除它,相应地设置其余指针。我什至尝试使用"免费"而不是"删除"进行删除,但这在我的情况下也不起作用。代码中没有错误,但节点在执行后不会被删除。 这是我的代码:

void remove(i)
{
node *n= find(i);
node *prev= n->GetPrev();
node *next=n->GetNext();
if(n!=NULL)
{
if(prev!=NULL && next!=NULL)
{
prev->SetNext(next);
next->SetPrev(prev);
delete n;
}
else if(prev!=NULL && next==NULL)
{
prev->SetNext(NULL);
delete n;
}
}
}

附言我以相同的方式为所有可能的情况编写了代码。

此类的析构函数编写为:

~DL()
{
node *current = head;
while (current)
{
node<T> *next = current->GetNext();
delete current;
current = next;
}
delete head;
delete tail;
}

我在列表中插入了不同的整数值。插入工作正常。但是当我尝试使用循环删除插入到列表中的节点时,返回了以前在头部的相同节点,显示它以前没有被删除。checkRemove 函数实现这些步骤。

checkRemove()
{
for (int i = 0; i < 50; i++)
{
addToHead(i);
}
while(length>10)
node *temp= returnHead(); 
if (temp != NULL)
cout<<"Value of head node is "<<temp->returnValue()<<endl;
remove(temp->returnValue());
}

就我而言,因为列表中的值是不同的,因此它们只出现一次。print 语句仅打印两次"头节点的值"语句,而不是打印值,直到列表的长度变为 9。

除此之外,你展示的不可能是你的真实代码,

void remove(i)
{
node *n = find(i);
node *prev = n->GetPrev();  // **** crash if n == NULL
node *next = n->GetNext();
if (n != NULL)  // **** is too late, execution will never reach this if n == NULL
{
if (prev != NULL && next != NULL)
{
prev->SetNext(next);
next->SetPrev(prev);
delete n;
}
else if (prev != NULL && next == NULL)
{
prev->SetNext(NULL);
delete n;
}
// n won't be deleted if both prev and next are nullptr
}
}

更简单:

void remove(int value)
{
node *n = find(value);
if (!n) return;  // nothing to do
node *prev = n->GetPrev();
node *next = n->GetNext();
if (prev) prev->SetNext(next);
if (next) next->SetPrev(prev);
delete n;
}