删除双向链表中的节点(C ++)

时间:2010-07-06 18:42:01

标签: c++ linked-list destructor

我在理解为什么在创建两个或更多节点时遇到问题(如下所示),函数void del_end()将只删除char name[20]而不是整个节点。如何在没有内存泄漏的情况下修复此问题?

#include <iostream>
using namespace std;

struct node
{
    char name[20];
    char profession[20];
    int age;
    node *nxt;
    node *prv;
};

node *start_ptr = NULL;

void del_end()
{
    node *temp, *temp2;
    temp = start_ptr;
    if (start_ptr == NULL)
        cout << "Can't delete: there are no nodes" << endl;
    else if (start_ptr != NULL && start_ptr->nxt == NULL)
    {start_ptr=NULL;}
    else
    {
    while (temp->nxt != NULL)
    {
        temp = temp->nxt;
    }
    temp2=temp->prv;
    delete temp;
    temp->nxt= NULL;
    }
}

4 个答案:

答案 0 :(得分:1)

delete temp2;

将删除整个节点。

答案 1 :(得分:1)

您的代码存在一些问题,最糟糕的是:

temp2=temp->prv;
delete temp2;
temp->nxt= NULL;

你正在删除倒数第二个节点,留下任何悬挂指针,并丢失最后一个节点。

但如果您发布更多真实代码,我们可以告诉您更多。

修改:
这是del_end的略微清理版本(并且还有很大的改进空间)。

void del_end()
{
  if (start_ptr == NULL)
  {
    cout << "Can't delete: there are no nodes" << endl;
    return;
  }

  if (start_ptr->nxt == NULL)
  {
    delete start_ptr;
    start_ptr = NULL;
    return;
  }

  node *nextToLast = start_ptr;
  node *last = start_ptr->nxt;

  while(last->nxt != NULL)
  {
    nextToLast = last;
    last = last->nxt;
  }

  delete last;
  nextToLast->nxt = NULL;

  return;
}

请注意,假设prev链接正确,这在这里似乎是谨慎的。

答案 2 :(得分:1)

答案 3 :(得分:1)