递归实现删除单链表L中值为X的结点中的错误

//递归实现删除单链表L中值为X的结点

#define _CRT_SECURE_NO_WARNINGS
#include
#include

typedef struct Lnode {
    int data;
    struct Lnode* next;
}lnode,*Linklist;

Linklist list_HeadInsert(Linklist& L) {//头查法建立单链表
    Lnode* s; int x;
    //L = (Linklist)malloc(sizeof(Lnode));
    //L->next = NULL;
    printf("请依次输入元素,以“9999”结束\n");
    scanf("%d", &x);
    while (x != 9999)
    {
        s = (Lnode*)malloc(sizeof(Lnode));
        s->data = x;
        s->next = L;
        L = s;
        scanf("%d", &x);
    }
    return L;
}
void Del(Linklist& L, int x)
{
    Lnode* p;
    if (L == NULL)
        return;
    if (L->data == x)
    {
        p = L;
        L = L->next;
        free(p);
        Del(L, x);
    }
    else
        Del(L, x);
}

int main()
{
    Linklist L;
    list_HeadInsert(L);
    printf("请输入要删除的元素值\n");
    int num;
    scanf("%d", &num);
    Del(L, num);
    Lnode* p = L->next;                                 //开始打印,工作指针用于打印
    while (p != NULL)
    {
        printf("%d ", p->data);                         //打印结果
        p = p->next;                                    //更新P指针
    }
    return 0;
    system("pause");
}

![img](

我的解答思路和尝https://img-mid.csdnimg.cn/release/static/image/mid/ask/202102174766151.png "#left")

运行之后输入数字就发生以上的错误,想着知道怎么解决