我的程序应该执行3个操作:1.insert 2.delete 3.show使用双向链接列表...我在删除功能方面有问题。这是代码:
void List::del()
{
int num;
Node *Aux1=first;
Node *Aux2=NULL;
if(isempty())
cout<<"List is Empty!"<<endl;
else
{
cout<<"Enter the number that you want to DELETE:"<<endl;
cin>>num;
while(Aux1->info!=num && Aux1 != NULL)
{
Aux2=Aux1;
Aux1=Aux1->left;
}
if(Aux1!=NULL)
{
if(Aux2!=NULL)
{
if(Aux1->left==NULL)
Aux2->left=NULL;
else
{
Aux2->left=Aux1->left;
Aux1=Aux1->left;
Aux1->right=Aux2;
}
}
else
{
first=Aux1->left;
//first->right=NULL;
}
}
system("pause");
}
}
在删除功能中,我想找到用户想要删除的号码,然后将其从列表中删除...问题是当用户输入列表中不存在的号码时!!在这种情况下,我希望我的程序不要在列表上做任何事情,也不要从列表中删除任何项目。但是当它发生时,我遇到了这个错误:
我的代码出了什么问题? ; - ?
答案 0 :(得分:1)
您的while
循环在检查NULL指针是否为NULL之前取消引用该NULL指针。您需要将循环更改为:
while(Aux1 != NULL && Aux1->info!=num)
答案 1 :(得分:0)
有问题的部分是以下部分:
while(Aux1->info!=num && Aux1 != NULL)
{
Aux2=Aux1;
Aux1=Aux1->left;
}
在检查Aux1是否为NULL之前取消引用。因此,您将在此循环中获得分段错误。
但是,您的数据结构存在更严重的问题。
首先,你的字段名称有点奇怪。通常,双向链表分别具有上一个和后一个元素的prev和next指针。
其次,您实际上并不计算项目,而是依赖于他们的信息字段。但是你永远不会更新这个字段,所以过了一段时间,这个ID将变得毫无意义和碎片化。
考虑用户输入五个节点的情况:
0 --> 1 --> 2 --> 3 --> 4
现在你调用delete(2):
0 --> 1 --> 3 --> 4
现在,您的用户必须获取所有ID并选择正确的ID,在这种情况下您的分段错误将会发生 - 如果用户再次调用delete(2),现在会发生什么? 通常,人们不会通过魔术ID号删除节点,而是使用一个函数来获取指向需要删除的节点的指针。
NodePayload* delete(Node* node)
然后,这将删除相应的节点,并可选地返回指向实际删除的节点/或其有效负载的指针。因为通常出于内存管理的原因,List类可能会分配节点,但不能分配它们的有效负载,因此用户可以使用List及其分配的自定义有效负载。