大神,这段小代码运行结束后总是崩溃,该如何该呢?多谢

请教各位大神,这段小代码运行结束后总是崩溃,该怎么该呢?谢谢
#include<stdio.h>
#include<stdlib.h>


#define FALSE 0
#define OK 1
#define ERROR 0


typedef int Status;
typedef int ElemType;


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

Status InitList_L(LinkList L); //初始话链表,返回头指针Head
LinkList CreatList_L(LinkList L, int n); //逆位序输入n个元素的值,建立带头结点的单链表L
void PrintLinkList_L(LinkList L); //输出链表

Status InitList_L(LinkList L)
{
L = (LinkList)malloc(sizeof(LNode));
if (L == NULL)
{
exit(ERROR);
}
L->next = NULL;
printf("初始化成功!\n");
return OK;
}
LinkList CreatList_L(LinkList L, int n)
{
int i = 0;
LNode *p = NULL;

printf("请依次输入%d个数据:\n", n);
for (i = n; i > 0; i --)
{
p = (LinkList)malloc(sizeof(LNode));
scanf("%d", &p->data);
p->next = L->next;
L->next = p;
}
printf("输入完成!\n");
}
void PrintLinkList_L(LinkList L)
{
LinkList p = L->next;
while (p != NULL)
{
printf("%4d", p->data);
p = p->next;
}
printf("\n");
}

Status main(void)
{
int n;
LNode L;
InitList_L(&L);
printf("请输入要输入数据的个数:");
scanf("%d", &n);
CreatList_L(&L, n);

PrintLinkList_L(&L);

return 0;
}

------解决方案--------------------
问题在于InitList_L这里有问题.
InitList_L的参数是LinkList.但函数的行为却是把参数当做LinkList*用.
要么把 InitList_L 里的分配动作去掉改成直接初始化对象.
要么把 LNode L;这里改成LinkList L; InitList_L参数改成LinkList*.

你现在的代码,初始化是无用的.因为你只是初始化了函数内分配的对象.但这个对象在后面使用的过程中被丢弃了.而main里的LNode L还是未初始化状态.所以最后PrintLinkList_L的时候访问了非法的内容.
最简单的改法:
Status InitList_L(LinkList L)
{
L->next = NULL;
printf("初始化成功!\n");
return OK;
}

------解决方案--------------------
C/C++ code
Status InitList_L(LinkList L)
{
    /*L = (LinkList*)malloc(sizeof(LNode));
    if (L == NULL)
    {
        exit(ERROR);
    }*/
    L->next = NULL;
    printf("初始化成功!\n");
    return OK;
}
LinkList CreatList_L(LinkList L, int n)
{
    int i = 0;
    LNode *p = NULL;

    printf("请依次输入%d个数据:\n", n);
    for (i = n; i > 0; i --)
    {
        p = (LinkList)malloc(sizeof(LNode));
        scanf("%d", &p->data);
        p->next = L->next;
        L->next = p;
    }
    
    printf("输入完成!\n");
    return L;
}
void PrintLinkList_L(LinkList L)
{
    LinkList p = L->next;
    while (p != NULL)
    {
        printf("%4d", p->data);
        p = p->next;
    }
    printf("\n");
}

Status main(void)
{
    int n;
    LNode L;    
    InitList_L(&L);
    printf("请输入要输入数据的个数:");
    scanf("%d", &n);
    CreatList_L(&L, n);

    PrintLinkList_L(&L);

    return 0;
}