用结构体链表创建一个学生管理系统时的困惑

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

我在对照着《啊哈,算法》这边书在学习链表,我试着去创建一个学生管理系统,这是我的代码

问题相关代码,请勿粘贴截图
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
    struct Student {
        char name[100];
        int age;
        char num[100];
        struct Student * next;
    };
    struct Student *head,*q,*p,*t;
    int i,n,a,ch;
    char buf[100];
    printf("请输入学生的数量:");
    scanf("%d", &n);
    head=NULL;
    for(i=0;i<n;i++){
        p=(struct Student *)malloc(sizeof(struct Student));
        printf("请输入第%d个学生的姓名",i+1);
        scanf("%s",buf);
        while ((ch = getchar()) != EOF && ch != '\n')
        {
        ;
        }
        strcpy(buf,p->name);
        printf("请输入第%d个学生的年龄",i+1);
        scanf("%d",&a);
        p->age=a;
        printf("请输入第%d个学生的学号",i+1);
        scanf("%s",buf);
        while ((ch = getchar()) != EOF && ch != '\n')
        {
        ;
        }
        strcpy(buf,p->num);
        p->next=NULL;
        if(head==NULL){
            head=p;
        }else{
            q->next = p;
        }q=p;
    }
    t=head;
    printf("请输入插班生的年龄");
    scanf("%d",&a);
    while(t!=NULL){
        if(t->next->age > a){
            p=(struct Student *)malloc(sizeof(struct Student));
            p->age=a;
            printf("请输入插班生的学号");
            scanf("%s",buf);
            while ((ch = getchar()) != EOF && ch != '\n')
            {
            ;
            }
            strcpy(buf,p->name);
            printf("请输入插班生的姓名");
            scanf("%s",buf);
            while ((ch = getchar()) != EOF && ch != '\n')
            {
            ;
            }
            strcpy(buf,p->name);
            t->next=p->next;
            p=t->next;
            break; 
        }
        t=t->next;
    }
    t=head;i=1;
    while(t!=NULL){
        printf("%d 位:",i);
        puts(p->name);
        printf("%d  ",p->age);
        puts(p->num);
        i++;
        t=t->next;
    }
    getchar();
    getchar(); 
    return 0;
 } 

运行结果及报错内容

当我在输入完结果等待输出时,只输出了一个
1位 然后程序就终止了,并且return了一个很大的值,明显不正常

我的解答思路和尝试过的方法

我在使用codeblocks调试时,在我输入完第一个学生的姓名后发现让我输入-13564413位学生的年龄,这是我在别的时候没有遇到过的

我想要达到的结果

我像知道我的程序错误在哪,因为编译的时候编译器并没有报错也没有警告