请问各位前辈,为什么会报错must point to struct?

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

typedef struct LNode
{
    int ID;
    char name[20];
    int score1;
    int score2;
    int score3;
    int total;
    struct LNode *next;
}LNode,*LinkList;
LinkList Creat(LinkList T,int n);
void Delete(LinkList T);
void Inquiry(LinkList T);
void Insert(LinkList T,int n);

void Insert(LinkList T,int n)
{
    int i;
    LNode *r=T,*p;
    while((r->next)!=NULL)
    {
        r=r->next;
    }
    for(i=0;i<n;i++)
    {
        p=(LNode *)malloc(sizeof(LNode));
        printf("请输入学生学号:");
        scanf("%d",&p->ID);
        printf("请输入学生姓名: ");
        scanf("%s",p->name);
        printf("请输入语文成绩: ");
        scanf("%d",&p->score1);
        printf("请输入数学成绩: ");
        scanf("%d",&p->score2);
        printf("请输入英语成绩: ");
        scanf("%d",&p->score3);
        p->total=p->score1+p->score2+p->score3;
        printf("总成绩为 %d\n",p->total);
        p->next=NULL;
        r->next=p;
        r=p;
    }
    printf("\n插入成功!");
}

void Inquiry(LinkList T)
{
    int id;
    printf("请输入想查询的学生学号: ");
    scanf("%d",&id);
    LNode *p=T;
    p=p->next;
    while(p!=NULL)
    {
        if(p->ID==id)
        {
            printf("\n学生成绩成功查询!\n");
            printf("学号: %d\n姓名: %s\n语文成绩: %d\n数学成绩: %d\n英语成绩: %d\n",p->ID,p->name,p->score1,p->score2,p->score3);
            break;
        }
        else
        {
            p=p->next;
        }
    }
    if(!p)
        printf("对不起,没有查询到学生成绩信息!");

}

void Delete(LinkList T)
{
    int id,flag=1;
    printf("请输入想要删除的学生的学号: ");
    scanf("%d",&id);
    LNode *p=T;
    //LNode *q;
    while((p->next)!=NULL)
    {
        if(p->next->ID==id)
        {
           //q=p->next;
            p->next=p->next->next;
           // delete q;
            printf("\n学生成绩信息已成功删除!\n");
            flag=0;
            break;
        }
        else
        {
            p=p->next;
        }
    }
    if(flag)
        printf("对不起!删除失败");
}

LinkList Creat(LinkList T,int n)
{
    LNode *p,*r;
    int i;
    T=(LNode *)malloc(sizeof(LNode));
    T->next=NULL;
    r=T;
    for(i=0;i<n;i++)
    {
        p=(LNode *)malloc(sizeof(LNode));
        printf("请输入学生学号:");
        scanf("%d",&p->ID);
        printf("请输入学生 姓名: ");
        scanf("%s",p->name);
        printf("请输入语文成绩: ");
        scanf("%d",&p->score1);
        printf("请输入数学成绩: ");
        scanf("%d",&p->score2);
        printf("请输入英语成绩: ");
        scanf("%d",&p->score3);
        p->total=p->score1+p->score2+p->score3;
        printf("总成绩为%d\n",p->total);
        p->next=NULL;
        r->next=p;
        r=p;
    }
    return T;
}

int main()
{
    LNode *p;
    int n;
    while(1)
    {
        printf("     学生成绩管理系统\n\n");
        printf("    1-查询学生成绩信息\n");
        printf("    2-插入学生成绩信息\n");
        printf("    3-删除学生成绩信息\n");
        printf("    0-退出系统\n\n");
        printf("P请输入数字(0-4):");
        int choice;
        scanf("%d",&choice);
        if(choice==0)
            exit(0);
        switch(choice)
        {
            case 1:printf("请输入想要查询的人数: ");
                    scanf("%d",&n);
                    int i=0;while(i<n){Inquiry(p);i++;}
                    break;
            case 2:printf("请输入想要插入成绩的人数: ");
                    scanf("%d",&n);Insert(p,n);
                    break;
            case 3:printf("请输入想要删除成绩的人数: ");
                    scanf("%d",&n);
                    i=0;while(i<n){Delete(p);i++;}
                    break;
            default:break;

        }

    }
    return 0;
}
代码如下,求助各位前辈

救救孩子吧

你的指针p没有创建对象啊,你debug的话就可以看到main的p的内容都会自动生成,调几次next最后指向一个会引起段错误的地方。你手动让p指向null就可以了