链表创建成功后,可以正常的进行创建、和插入数据,但是在执行删除节点之后,链表的数据无法正常输出

链表创建成功后,可以正常的进行创建、和插入数据,但是在执行删除节点之后,链表的数据无法正常输出,在检测时发现,删除节点的函数形参返回后实参错乱,请问怎么解决

#include<stdio.h>
#include<stdlib.h>

#define OK 1
#define ERROR 0

typedef int ElenType;/*线性表中存储的数据类型*/

typedef struct Node
{/*线性表的单链表存储结构*/
    ElenType data;
    struct Node *next;
}Node;
typedef struct Node *LinkList;/*定义指针*/

void Initialize(LinkList *L)
{
    *L = (LinkList)malloc(sizeof(Node));
    (*L)->next = NULL;
}

void create(LinkList *L)
{
    int i,j=1;
    LinkList p, q;
    p = *L;
    printf("请输入需要初始化的数据个数:");
    scanf_s("%d", &i);
    while (j <= i)
    {
        q = (LinkList)malloc(sizeof(Node)); 
        printf("请输入第%d个数据:",j);
        scanf_s("%d", &q->data);
        p->next = q;
        p = p->next;
        j++;
    }
    p->next = NULL;
}

int Insertion(LinkList *L, int i,ElenType e)
{/*插入数据*/
    int j=1;
    LinkList q, p;
    p = *L;
    while (p&&j < i)
    {/*寻找需要插入的位置*/
        p = p->next;
        ++j;
    }
    if (!p || j > i)
        return ERROR;
    q = (LinkList)malloc(sizeof(Node));
    q->data = e;
    q->next = p->next;
    p->next = q;
    return OK;
}

void InsertionMenu(LinkList *L)
{
    int i, j;
    printf("请输入需要插入的位置");
    scanf_s("%d", &j);
    printf("请输入需要插入的数据:");
    scanf_s("%d", &i);
    Insertion(L, j, i);
}



void Display(LinkList L)
{/*输出链表中的数据*/
    LinkList p = L->next;
    if (!p)
        printf("链表为空!\n");
    else
    {
        while (p)
        {
            printf("%d  ", p->data);
            p = p->next;
        }
        putchar('\n');
    }
}

int Delete(LinkList *L,int i)
{/*删除某个位置上的数据*/
    LinkList q, p;
    int j=1;
    p = *L;
    while (j <= i && p)
    {
        p = p->next;
        j++;
    }
    if (j > i+1 || !p)
        return ERROR;
    q = p;
    p= q->next;
    free(q);
    return OK;
}

void menu()
{
    printf("程序的功能菜单:\n0:菜单\n1:创建链表\n2:插入数据\n3:删除某个位置上的数据\n");
}

int main(void)
{
    int i = 0,j;
    LinkList L;
    while (i != 7)
    {
        switch (i)
        {
        case 0:
            menu();
            break;
        case 1:
            Initialize(&L);
            create(&L);
            printf("链表中的数据为:");
            Display(L);
            break;
        case 2:
            InsertionMenu(&L);
            printf("插入数据后的链表中的数据为:");
            Display(L);
            break;
        case 3:
            printf("请输入需要删除的数据的位置:");
            scanf_s("%d", &j);
            Delete(&L, j);
            printf("删除数据后的链表中的数据为:");
            Display(L);
            break;
        default:
            printf("不存在该功能选项!\n");
            break;
        }
        printf("请输入需要执行的选项:");
        scanf_s("%d", &i);
    }
    printf("感谢您的使用!\n");
    return 0;
}

图片说明

用本画一画,就知道怎么回事了。
答案我更新了。

int Delete(LinkList *L, int i)
{ /*删除某个位置上的数据*/
    LinkList q, p;
    int j = 1;
    p = *L;

    while (j <= i && p)
    {
        p = p->next;
        j++;
    }

    if (j > i + 1 || !p)
        return ERROR;

    q = p->next;
    p->next = p->next->next;
    free(q);

    return OK;
}