递归实现单链表删除元素为x的结点

代码如下,我也看到了很多人都是这么写的,可我实际跑的时候发现链表没有断开,单步调试发现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);    //调用的时候这么写
}

你试一下这个,我大概写了一下,我这边没有其他代码也就没有测试。你看看能不能跑通?