c语言单链表计算表长出错

问题遇到的现象和发生背景

c语言创建单链表

用代码块功能插入代码,请勿粘贴截图
typedef int ElemType;

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

int ListLength(LinkList L){
     Lnode *p;
     p = L->next;
     int count = 0;
     while(p != NULL){
         count++;
         p = p->next;
    }
    return count;
 }

void CreatList_H(LinkList L,int n){
    L = (LinkList)malloc(sizeof(Lnode));
    L->next = NULL;
    int i = 0;
    for(i = 0;i < n;i++){
        Lnode *p = (LinkList)malloc(sizeof(Lnode));
        scanf("%d",&p->data);
        p->next = L->next;
        L->next = p;
    }
} 

int main(){
    LinkList L;
    CreatList_H(L,3);//头插法 
    int count = ListLength(L); //表长 
    printf("%d",count);
    
    printf("1111111111111111111111");
    
    return 0;
} 

运行结果及报错内容

img

我想要达到的结果

正常计算出单链表的长度

修改处见注释,供参考:

#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct Lnode{
    ElemType data;
    struct Lnode *next;
}Lnode,*LinkList;
int ListLength(LinkList L){
     Lnode *p;
     p = L->next;
     int count = 0;
     while(p != NULL){
         count++;
         p = p->next;
    }
    return count;
 }
void CreatList_H(LinkList* L,int n){ //(LinkList L,int n) //修改
    (*L) = (LinkList)malloc(sizeof(Lnode));//L = 修改
    (*L)->next = NULL;               //L  //修改
    int i = 0;
    for(i = 0;i < n;i++){
        Lnode *p = (LinkList)malloc(sizeof(Lnode));
        scanf("%d",&p->data);
        p->next = (*L)->next;//L->next; 修改
        (*L)->next = p;      //L->next = p; 修改
    }
}
int main(){
    LinkList L;
    CreatList_H(&L,3);//头插法
    //CreatList_H(L,3); 修改
    int count = ListLength(L);//表长
    printf("%d\n",count);         //修改

    printf("1111111111111111111111");
    return 0;
}

这样的create函数是不能实现L指针地址修改的
需要改成LinkIist*类型

CreatList_H函数中,L->next = p;改为p=p->next;