C语言链表和结构体求和

编写一段完整的程序代码,将学生的信息构造成结构体(包括学号,姓名,两门课程成绩和总分)统计某班五名学生课程A和课程B的成绩,计算出每个学生总分后依次将学生学号,姓名和总分输出,利用动态链表实现上述功能

#include <stdio.h>
#include <stdlib.h>

struct Student{
    int id;
    char name[20];
    int scoremath;
    int scoreeng;
    struct Student* next;
};



int main()
{
    struct Student *head = 0, *t,*p;
    int i;
    
    head = (struct Student *)malloc(sizeof(Student));
    head->next = 0;
    p = head;

    //录入数据
    for (i=0;i<5;i++)
    {
        if(i==0)
        {
            printf("请输入第%d个学生的学号:",i+1);
            scanf("%d",&head->id);
            printf("请输入第%d个学生的名字:",i+1);
            scanf("%s",head->name);
            printf("请输入第%d个学生的数学成绩和英语成绩:",i+1);
            scanf("%d %d",&head->scoremath,&head->scoreeng);
        }else
        {
            t = (struct Student *)malloc(sizeof(Student));
            printf("请输入第%d个学生的学号:",i+1);
            scanf("%d",&t->id);
            printf("请输入第%d个学生的名字:",i+1);
            scanf("%s",t->name);
            printf("请输入第%d个学生的数学成绩和英语成绩:",i+1);
            scanf("%d %d",&t->scoremath,&t->scoreeng);
            t->next = 0;
            p->next = t;
            p = t;
        }
        

        
    }


    //计算总成绩并输出
    p = head;
    while(p)
    {
        printf("%d %s %d %d %d\n",p->id,p->name,p->scoremath,p->scoreeng,p->scoremath + p->scoreeng);
        p = p->next;
    }

    //释放空间
    p = head;
    while(head)
    {
        p = head->next;
        free(head);
        head = p;
    }

    return 0;


}