为什么不使用“删除”关键字删除节点?

时间:2018-10-23 05:04:59

标签: c++ linked-list nodes

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

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;
         }
    }
}

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

此类的析构函数写为:

~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。

1 个答案:

答案 0 :(得分:2)

除了显示的内容不是您的真实代码之外,

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;
}