代码如下,我也看到了很多人都是这么写的,可我实际跑的时候发现链表没有断开,单步调试发现free掉的一个结点的前驱仍然指向该结点地址,但是该地址内存数据已经更改,导致整个链表出错找不到,有大佬帮看看吗
void deleteX (struct listNodes *l,int x){
struct listNodes *p;
if (l==NULL) return;
if(l->data==x){
p=l;
l=l->next;
free(p);
deleteX(l,x);
}
else deleteX(l->next,x);
}
这怎么可能是对的?你自己都说了,free掉的一个结点的前驱仍然指向该结点地址,你根本就没有对前驱的next域做出改变呀,怎么可能指望它指向free掉节点的下一个以把链表链起来。
你要删除节点必须要获取到当前节点的前驱节点才能删除当前节点。你这个函数只考虑当前节点,直接把当前节点释放掉链表不就直接断了,根本就是错的啊,你在哪里看到很多人这么写?
int deleteX (struct listNodes *pre,struct listNodes *l,int x){
if (l==NULL) return 0;
if(l->data==x){
if(pre==NULL){
struct listNodes *p = l;
l=l->next;
free(p);
return 1;
}
pre->next=l->next;
free(l);
return 1;
}
else deleteX(l,l->next,x);
}
int main(){
deleteX(NULL,L,5); //调用的时候这么写
}
你试一下这个,我大概写了一下,我这边没有其他代码也就没有测试。你看看能不能跑通?