我在理解为什么在创建两个或更多节点时遇到问题(如下所示),函数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;
}
}
答案 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)