c语言 链表读取访问权限出错

我想写一个单链表,然后用节点内部数据排序输出、
然后就出现了这个问题。

img

这个是我的代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define LEN sizeof(struct Teacher)
struct Teacher
{
    char name[20];
    int number;
    struct Teacher* next;
};

int n;
struct Teacher* creat()
{
    struct Teacher* p1 = NULL;
    struct Teacher* p2 = NULL; 
    struct Teacher *head = NULL;
    p1 = p2 = new struct Teacher;
    scanf_s("%s%d", p1->name, sizeof(p1->name), &p1->number);
    while (p1->number != 0)
    {
        n = n + 1;
        if (n == 1)
            head = p1;
        else
            p2->next = p1;
        p2 = p1;
        p1 = new struct Teacher;
        scanf_s("%s%d", p1->name, sizeof(p1->name), &p1->number);
    }
    p2 = NULL;
    return head;
}

void print_teacher(struct Teacher* head)                 //输出信息列表
{
    struct Teacher* p;
    p = head;
    if (head != NULL)
    {
        while (p != NULL)
        {
            printf("%s   %d\n", p->name, p->number);
            p = p->next;
        }
    }
}

void sort_teacher1(struct Teacher* head)                          //教师工号排序(升序)
{
    if (head == NULL)
        return ;
    else
    {
        struct Teacher* p1 = head;
        struct Teacher* p2 = NULL;
        while (p1->next != NULL)
        {
            p2 = p1->next;
            if (p1->number >p2->number)
            {
                Teacher t;
                t = *p1;
                t.next = p2->next;
                p2->next = p1->next;
                *p1 = *p2;
                *p2 = t;
            }
            p1 = p1->next;
        }
    }
    
}


int main()
{
    struct Teacher* head;
    head = creat();
    sort_teacher1(head);
    print_teacher(head);
    return 0;
}

create函数有问题,最后一个节点的next指针没有指向NULL
n = n + 1;这里使用n的时候,n没有初始化
create函数修改如下:

#include <stdio.h>
struct Teacher
{
    char name[20];
    int number;
    struct Teacher* next;
};
int n;

struct Teacher* creat()
{
    struct Teacher* p1 = NULL;
    struct Teacher* p2 = NULL; 
    struct Teacher *head = NULL;
    p1 = p2 = new struct Teacher;
    n = 0; //修改1:初始化n
    scanf_s("%s%d", p1->name, sizeof(p1->name), &p1->number);
    while (p1->number != 0)
    {
        n = n + 1;
        if (n == 1)
        {
            head = p1;
            p2 = head; //修改2:给p2赋值
        }
        else
            p2->next = p1;
        p2 = p1;
        p1 = new struct Teacher;
        scanf_s("%s%d", p1->name, sizeof(p1->name), &p1->number);
    }
    p2->next = NULL; //修改3,不是p2 = NULL
    //最后的p1没用,需要释放空间
    delete p1; p1=0;
    return head;
}



struct Teacher* sort_teacher1(struct Teacher *head)   //排序
{
    if(NULL == head)    //若链表为空则不用排序
    {
        return NULL;
    }
    if(NULL == head->next)  //若链表中只有一个数,则不用比较
    {
        printf("min is head\n");
        return head;
    }
    struct Teacher *min_pre = NULL;
    struct Teacher *min = head;
    struct Teacher *tmp = head;
    struct Teacher *new_list = NULL;   
    struct Teacher *tail_sort = NULL;

    while(head)
    {
        min = head;
        tmp = head;
        while(tmp->next)
        {
            if(min->number > tmp->next->number)
            {
                min = tmp->next;
                min_pre = tmp;
            }
            tmp = tmp->next;
        }
        if(min == head)
        {
            head = head->next;
        }
        else
        {
            min_pre->next = min->next;
            min->next = NULL;
        }
        if(NULL == new_list)    //按照尾插将最小的数组成新的链表
        {
            tail_sort = min;
            new_list = tail_sort;
        }
        else
        {
            tail_sort->next = min;
            tail_sort = min;
        }
    }
    return new_list;
}


void print_teacher(struct Teacher* head)                 //输出信息列表
{
    struct Teacher* p;
    p = head;
    if (head != NULL)
    {
        while (p != NULL)
        {
            printf("%s   %d\n", p->name, p->number);
            p = p->next;
        }
    }
}

int main()
{
    struct Teacher* head;
    head = creat();
    head = sort_teacher1(head);
    print_teacher(head);
    return 0;
}

12行int n应该改为 int n=0;
由于n没有初始化为0,导致n=n+1后,n值不是1,
因此
if (n == 1)
head = p1;
条件不成立,从而head没有赋值
同时由于78行定义head的时候没有初始化为NULL,导致sort函数中
if (head == NULL)
判断无效,从而后续对head的操作必然会崩溃