学生通讯录管理系统 代码报错

学生通讯录管理系统
建立某班学生的通讯录,要求用链表存储。
具体功能包括:
1)可以实现插入一个同学的通讯录记录;
2)能够删除某位同学的通讯录;
3)对通讯录打印输出。
设计要求:
(1)定义通讯录内容的结构体;
(2)建立存储通讯录的链表结构并初始化;
(3)建立主函数:
1)建立录入函数(返回主界面)
2)建立插入函数(返回主界面)
3)建立删除函数(返回主界面)
4)建立输出和打印函数(返回主界面)
I)通过循环对所有成员记录输出
II)输出指定姓名的某个同学的通讯录记录
5)退出

写了半天改了半天还是没看出来哪错了,求帮忙看一下

#include
#include
#include
#include

typedef struct stu
{
    long long nmber;
    char name[10];
    struct stu* next;
}student;

student* init()
{
    return NULL;
}
student* get_num(student* head)
{
    int flag;
    head = (student*)malloc(sizeof(student));
    student* q, * p = head;
    p->next = NULL;
    printf("请输入第一个同学的数据(姓名、手机号)\n");
    char nam[10];
    int i = 2;
    flag = scanf_s("%s", nam);
    while (1)
    {

        scanf_s("%lld", &p->nmber);
        strcpy_s(p->name, nam);
        printf("请输入第%d个同学的信息:\n", i++);
        flag = scanf_s("%s", nam);
        if (flag == 1)
        {
            q = (student*)malloc(sizeof(student));
            q->next = NULL; p->next = q; p = q;
        }
        else break;
    }
    return head;
}
student* insert(student* head, int position)
{
    int flag;
    char nam[10];
    student* p = head, * q = NULL;
    if (position < 1)
    {
        printf("输入位置有误!");
        exit(1);
    }
    q = (student*)malloc(sizeof(student));
    printf("请输入增加的学生的姓名、手机号:\n");
    flag = scanf_s("%s", nam);
    scanf_s("%lld", &q->nmber); q->next = NULL;
    if (flag == 1)
        strcpy_s(q->name, nam);
    if (position == 1)
    {
        if (!p)
        {
            printf("通讯录为空!\n");
            exit(1);
        }
        else
        {
            q->next = p; return q;
            printf("插入成功!\n");
        }
    }
    else
    {
        for (int i = 1; p; i++)
        {
            if (i + 1 == position)
            {
                q->next = p->next;
                p->next = q;
                printf("插入成功!\n");
                return head;
            }
        }
        if (!p)
        {
            printf("未找到增加的位置!\n");
            return head;
        }
    }
}
student* del(student* head, int position)
{
    student* p = head, * q = NULL;
    if (!p)
    {
        printf("删除失败,链表为空!\n");
    }
    if (position < 1)
    {
        printf("删除失败,输入的位置有误!\n");
        return head;
    }
    if (position == 1)
    {
        if (p->next)
        {
            q = p;
            head = p->next;
            free(q);
            return head;
        }
        printf("删除成功!\n");
    }
    for (int i = 1; p; i++)
    {
        if (i + 1 == position && p->next)
        {
            q = p->next;
            p->next = p->next->next;
            free(q);
            return head;
        }
        p = p->next;
        printf("删除成功!\n");
    }
    if (!p)
    {
        printf("删除失败,该位置处无元素!\n");
    }
}
void display(student* head)
{
    student* p = head;
    if (!p)
    {
        printf("链表为空!\n");
        exit(1);
    }
    else
        while (p)
        {
            printf("%-20s %-12lld\n", p->name, p->nmber);
            p = p->next;
        }
}
void main()
{
    int order, position;
    student* head = init();
    head = get_num(head);
    printf("请输入你要的操作(1.插如一个同学,2.删除某个同学的信息,3.输出同学们的信息):");
    scanf_s("%d", &order);
    if (order == 1)
    {
        printf("请输入要插入的节点位置:\n");
        scanf_s("%d", &position);
        head = insert(head, position);
    }
    if (order == 2)
    {
        printf("请输入要删除节点的值:\n");
        scanf_s("%d", &position);
        head = del(head, position);
    }
    if (order == 3)
    {
        printf("输出结果为:\n");
        display(head);
    }
}

构建时正常,输入数据后如图报错

img

本人初学者,可能会犯很多低级错误,求各位斧正

这种错误就是scanf输入的格式不匹配
flag = scanf_s("%s", nam);
改为
flag = scanf_s("%s", nam,10);
===========
scanf_s使用要注意,如果输入字符串,那么在字符串变量后面一定要加上字符串最大长度值。否则会报错