C语言写单链表出现的问题,如何解决?

C语言书写单链表出现了致命错误,不知道怎么改

问题背景:
编写一个程序依次实现如下功能:
(1)在第i个元素之前插入一个元素e
(2)删除位序为i的元素,并将删除的节点的值由变量e返回;
(3)由变量e获取位序为i的元素的值;
(4)输出此表;
(5)退出程序时销毁此表。

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define ok 1;
#define error 0;
typedef int ElemType;

typedef struct LNode
{
    ElemType data;
    struct Node * next;
}LNode,* LinkList;

void InitList(LinkList L) 
{ 
    L=(LinkList)malloc(sizeof(LNode));
    L->next = NULL; 
}

void CreateList_L(LinkList L, int n) 
{
    LNode *r,*s;//*r是尾指针
    ElemType c, flag=1;
    r=L;//动态指向当前表尾
    while(flag)
    {
        scanf("%d",&c);
        if(c!=0)
        {
            s=(LNode*)malloc(sizeof(LNode));
            s->data = c;
            r->next = s;
            r = s;
        } 
        else
        {
            flag=0;
            r->next=NULL; 
        }
    }
} 

int ListInsert_L(LinkList L, int i,ElemType e)//单链表的插入
{
    LNode *pre,*s;
    int k;
    pre=L;
    k=0;
    if(i<=0)
        return error;
    
    while(pre!=NULL&&k<i-1)
    {
        pre=pre->next;
        k=k+1;
    }//查找第i-1个结点
    if(pre==NULL)
        return error;
    s=(LNode*)malloc(sizeof(LNode));//申请一个新的结点
    s->data=e;//e放到s的数据域
    s->next=pre->next;//pre next域替换成 s next域
    pre->next=s; 
    return ok;
} 

int ListDelete_L(LinkList L, int i,ElemType *e) 
{
    LNode *pre,*r;
    int k; 
    pre=L;
    k=0;
    while(pre->next!=NULL&&k<i-1)
    {
        pre=pre->next;
        k=k+1;
    }
    if(pre->next==NULL)
    return error;
    r=pre->next;
    pre->next=r->next;
    *e=r->data;
    free(r);
    return ok; 
}

LNode *LocateElem_L(LinkList L, int e) 
{ 
    LinkList p;
    p = L->next;
    while (p && p->data!= e)
        p = p->next; 
    return p; 
}

    


int main() 
{
    int a, n,length;
    char choose;
    ElemType e;
    //LNode L;
    LinkList L, p;
    
    InitList(L);
    
    while (1) 
    {
        printf("1-- 建立\n");
        printf("2-- 输入\n");
        printf("3-- 插入\n");
        printf("4-- 删除\n");
        printf("5-- 查找\n");
        printf("6-- 输出\n");
        printf("0-- 退出\n\n");
        printf("请选择:");
        scanf("%d,&choose");

        switch (choose)
        {
        case '1': //建立一个单链表
            if (InitList_L(L))
                printf("成功建立链表!");
            break;
        case '2': //使用后插法创建单链表
            CreateList_L(L, length);
            printf("输入单链表\n\n");
            break;
        
        case '3': //单链表的插入
            printf("请输入元素插入的位置a:");
            scanf("%d;&a");
            printf("请输入待插入的元素e:");
            scanf("%d;&e");
    
            if (ListInsert_L(L, a, e))
                printf("插入成功.");
            else
                printf("插入失败!");
            break;
        case '4': //单链表的删除
            printf("请输入待删除元素的位置:");
            scanf("%d;&a");
            if (ListDelete_L(L, a, e))
                printf("删除成功!\n\n");
            else
                printf("删除失败!\n\n");
            break;
        case '5': //单链表的查找
            printf("请输入所要查找的位置:");
            scanf("%d;&a");
            if (LocateElem_L(L, a) != NULL) 
            {
                printf("查找成功  查找的值为:%d\n",LocateElem_L(L,a)->data);
                
            } else
                printf("查找失败! \n\n");
            break;
        case '6': //单链表的输出
            printf("该单链表的内容为:\n\n");
            p=L->next;
            while(L->next!=NULL)
            {
                printf("%d,L->next->date");
                L=L->next;
            }
            printf("\n");
            break;
        }
    }
    return 0;
}

运行结果及报错内容

img

Initlist_l没有定义。上面定义的是少了个L 定义的是这个InitList

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^