当我执行某些测试用例时,程序在释放错误后抛出堆使用

当我运行这个程序时,它可以工作,除非我删除了一个相当大的数字,比如100或更大的数字,每当我远程输入任何与这个数字一样大的数据时,我都会在无错误后使用堆。终端表示这是由insert()中的第53行引起的,这一行是tail->next=newNode。我知道将头指针和尾指针作为全局变量并不是编写它的最佳方式,但一旦我让它工作起来,我会改变它

无效插入(int-nda){
结构节点*newNode=(结构节点*)malloc(sizeof(结构节点)+10);
新节点->数据=数据;
newNode->next=NULL;
如果(检查重复项(数据)==1){
回来
}否则{
if(head==NULL){
头=新节点;
tail=newNode;
}
否则{
&newtail=next-gt;
tail=newNode;
}  
}
}
无效删除(int n){
如果(头部->数据==n){
结构节点*tempHead=head;
头部=头部->下一步;
免费(临时工);
回来
}否则{
结构节点*当前=头部;
结构节点*prev=NULL;
while(当前!=NULL&当前->数据!=n){
prev=当前值;
当前=当前->下一步;
}
if(current==NULL)返回;
上一个->下一个=当前->下一个;
自由(电流);
}
}

可能存在tail->next=newNode将在一个已释放的节点上执行:当前面调用delete并删除列表中的尾部节点时,会发生这种情况。在这种情况下,代码不会调整tail的值

因此,在删除更改中:

头部=头部->下一个

致:

头部=头部->下一个
if(head==NULL){
tail==NULL;
}

else块更改中:

prev->下一步=当前->下一个
自由(电流);

致:

prev->下一步=当前->下一个
如果(尾部==当前){
尾部=上一个;
}
自由(电流);

发表评论