看看这个链表为什么跑不起来吧

才学链表,抄了一个书上的,为什么一直跑不起啊,我用的vs2019

//C语言构建链表
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct stud_node {
    int num;
    char name[20];
    int score;
    struct stud_node* next;
};
struct stud_node* Create_Stu_Doc();//新建链表
struct stud_node* InsrtDoc(struct stud_node* head, struct stud_node* stud);//插入
struct stud_node* DeleteDoc(struct stud_node* head, int num);//删除
void Print_stu_Doc(struct stud_node* head);//遍历
int main()
{
    struct stud_node* head, * p;
    int choice, num, score;
    char name[20];
    head = NULL;
    int size = sizeof(struct stud_node);

    do {
        printf("1:create 2:insert 3:delete 4:print 0:exit\n");
        scanf_s("%d", &choice);
        switch (choice) {
        case 1:
            head= Create_Stu_Doc();
            break;
        case 2:
            printf("Input num,name and score:\n");
            scanf_s("%d%s%d",&num,name,&score);
            p = (struct stud_node*)malloc(size);
            p->num = num;
            strcpy_s(p->name, name);
            p->score = score;
            head = InsrtDoc(head, p);
            break;
        case 3:
            printf("Input num:\n");
            scanf_s("%d", &num);
            head = DeleteDoc(head, num);
            break;
        case 4:
            Print_stu_Doc(head);
            break;
        case 0:
            break;
        }
    } while (choice != 0);

    return 0;
}
//新建链表
struct stud_node* Create_Stu_Doc()
{
    struct stud_node* head, * p;
    int num, score;
    char name[20];
    int size = sizeof(struct stud_node);

    head = NULL;
    printf("Input num,name and score:\n");
    scanf_s("%d%s%d",&num,name,&score);
    while (num != 0)
    {
        p = (struct stud_node*)malloc(size);
        p->num = num;
        strcpy_s(p->name, name);
        p->score = score;
        head = InsrtDoc(head, p);     //调用插入函数
        scanf_s("%d%s%d", &num, name, &score);
    }
    return head;
}
//插入
struct stud_node* InsrtDoc(struct stud_node* head, struct stud_node* stud)
{
    struct stud_node* ptr, * ptr1, * ptr2;
    ptr2 = head;
    ptr = stud;
    if (head == NULL)
    {
        head = ptr;
        head->next = NULL;
    }
    else{
        while ((ptr->num > ptr2->num) && (ptr2->next != NULL)) {
            ptr1 = ptr2;
            ptr2 = ptr2->next;
        }
        if (ptr->num <= ptr2->num) {
            if (head == ptr2) head = ptr;
            else ptr1->next = ptr;
            ptr->next = ptr2;
        }
        else {
            ptr2->next = ptr;

这是后半截代码

ptr->next = NULL;
}
}
return head;
}
//删除
struct stud_node* DeleteDoc(struct stud_node* head, int num)
{
struct stud_node * ptr1, * ptr2;
while (head != NULL && head->num == num) {
ptr2 = head;
head = head->next;
free(ptr2);
}
if (head == NULL)
return NULL;
ptr1 = head;
ptr2 = head->next;
while (ptr2 != NULL) {
if (ptr2->num == num) {
ptr1->next = ptr2->next;
free(ptr2);
}
else
ptr1 = ptr2;
ptr2 = ptr1->next;
}
return head;
}
//遍历
void Print_stu_Doc(struct stud_node* head)
{
struct stud_node*ptr;
if (head == NULL)
{
printf("\nNo Records\n");
return;
}
printf("\nThe Students'Records Are:\n");
printf("num\tname\tscore\n");
for(ptr=head;ptr!=NULL;ptr=ptr->next)
printf(" %d\t%s\t%d\n",ptr->num, ptr->name, ptr->score);
}

整理修改如下,供参考:

//C语言构建链表
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct stud_node {
    int num;
    char name[20];
    int score;
    struct stud_node* next;
};
struct stud_node* Create_Stu_Doc();//新建链表
struct stud_node* InsrtDoc(struct stud_node* head, struct stud_node* stud);//插入
struct stud_node* DeleteDoc(struct stud_node* head, int num);//删除
void   Print_stu_Doc(struct stud_node* head);//遍历
int main()
{
    struct stud_node* head, * p;
    int choice, num, score;
    char name[20];
    head = NULL;
    int size = sizeof(struct stud_node);
    do {
        printf("1:create 2:insert 3:delete 4:print 0:exit\n");
        scanf_s("%d", &choice);
        switch (choice) {
        case 1:
            head = Create_Stu_Doc();
            break;
        case 2:
            printf("Input num,name and score:\n");
            scanf_s("%d%s%d", &num, name, 20, &score);          //scanf_s("%d%s%d", &num, name, &score);
            p = (struct stud_node*)malloc(sizeof(struct stud_node));  //p = (struct stud_node*)malloc(size);
            p->num = num;
            strcpy_s(p->name, name);
            p->score = score;
            head = InsrtDoc(head, p);
            break;
        case 3:
            printf("Input num:\n");
            scanf_s("%d", &num);
            head = DeleteDoc(head, num);
            break;
        case 4:
            Print_stu_Doc(head);
            break;
        case 0:
            break;
        }
    } while (choice != 0);
    return 0;
}
//新建链表
struct stud_node* Create_Stu_Doc()
{
    struct stud_node* head, * p;
    int num, score;
    char name[20];
    int size = sizeof(struct stud_node);
    head = NULL;
    printf("Input num,name and score:\n");
    scanf_s("%d%s%d", &num, name, 20, &score);  //scanf_s("%d%s%d", &num, name, &score);
    while (num != 0)
    {
        p = (struct stud_node*)malloc(size);
        p->num = num;
        strcpy_s(p->name, name);
        p->score = score;
        head = InsrtDoc(head, p);     //调用插入函数
        scanf_s("%d%s%d", &num, name, 20, &score);  //scanf_s("%d%s%d", &num, name, &score);
    }
    return head;
}
//插入
struct stud_node* InsrtDoc(struct stud_node* head, struct stud_node* stud)
{
    struct stud_node* ptr, * ptr1, * ptr2;
    ptr2 = head;
    ptr = stud;
    if (head == NULL)
    {
        head = ptr;
        head->next = NULL;
    }
    else {
        while ((ptr->num > ptr2->num) && (ptr2->next != NULL)) {
            ptr1 = ptr2;
            ptr2 = ptr2->next;
        }
        if (ptr->num <= ptr2->num) {
            if (head == ptr2) head = ptr;
            else ptr1->next = ptr;
            ptr->next = ptr2;
        }
        else {
            ptr2->next = ptr;
            ptr->next = NULL;
        }
    }
    return head;
}
//删除
struct stud_node* DeleteDoc(struct stud_node* head, int num)
{
    struct stud_node* ptr1, * ptr2;
    while (head != NULL && head->num == num) {
        ptr2 = head;
        head = head->next;
        free(ptr2);
    }
    if (head == NULL)
        return NULL;
    ptr1 = head;
    ptr2 = head->next;
    while (ptr2 != NULL) {
        if (ptr2->num == num) {
            ptr1->next = ptr2->next;
            free(ptr2);
        }
        else
            ptr1 = ptr2;
        ptr2 = ptr1->next;
    }
    return head;
}
//遍历
void Print_stu_Doc(struct stud_node* head)
{
    struct stud_node* ptr;
    if (head == NULL)
    {
        printf("\nNo Records\n");
        return;
    }
    printf("\nThe Students'Records Are:\n");
    printf("num\tname\tscore\n");
    for (ptr = head; ptr != NULL; ptr = ptr->next)
        printf(" %d\t%s\t%d\n", ptr->num, ptr->name, ptr->score);
}