c语言程序设计问题(动态链表)

写了一个建立动态链表的函数,一运行发现程序也不报错,在输入数据后卡着不动,也不返回。
代码和运行如下图

img
img

修改如下,供参考对照:

#include<stdio.h>
#include<malloc.h>
struct Student {
    int   num;
    int   score;
    struct Student* next;
};

int n;
struct Student* a()
{
    struct Student* head, * p1, * p2;
    n = 0;
    p1 = p2 = (struct Student*)malloc(sizeof(struct Student));
    printf("请输入第%d位的成绩:",n+1);
    scanf("%d%d", &p1->num, &p1->score);
    head = NULL;
    while (p1->num != 0)
    {
        n = n + 1;
        if (n == 1)
        {
            head = p1;
        }
        else
        {
            p2->next = p1;
            p2 = p1;
        }
        p1 = (struct Student*)malloc(sizeof(struct Student));
        printf("请输入第%d位的成绩:", n + 1);
        scanf("%d%d", &p1->num, &p1->score);        
    }
    p2->next = NULL;
    return head;
}

int main()
{
    struct Student* pt;
    pt = a();
    while (pt)
    {
        printf("%d %d\n", pt->num, pt->score);
        pt = pt->next;
    }
    
    return 0;
}

我觉得问题出在while循环里面语句的顺序上,可能需要先给p1申请动态空间并且进行赋值,然后才能把它加到链表里面去吧。