c语言结构体成绩排名

问题遇到的现象和发生背景
编写一个基于结构体的学生成绩信息管理系统。主要功能如下:

用结构体数组存放n个学生的个人信息和4门课程的成绩。
计算每个学生的总分 、平均分以及名次。
按总分从高到低排序。
输出所有学生成绩信息。

问题相关代码,请勿粘贴截图
#include
#include
struct date{
int year;
int month;
int day;
};
struct STUDENT{
long SID;
char name[10];
char sex[4];
struct date birthday;
float score[4];
float total;
float average;
int rank;
};

void Input(struct STUDENT *stud, int n);
void Print(struct STUDENT *stud, int n);
void TotalAndAverage(struct STUDENT *stud, int n);
void RankByTotal(struct STUDENT *stud, int n);

int main()
{
int n;
struct STUDENT *stu;
scanf("%d",&n);
stu = (struct STUDENT)malloc(nsizeof(struct STUDENT));
Input(stu,n);
TotalAndAverage(stu,n);
RankByTotal(stu,n);
Print(stu,n);
return 0;
}
//此函数输入n个学生的信息到stud指针变量指向的结构体数组中
//输入的信息包括学生的学号,姓名,性别,出生年月日,4门功课的成绩
void Input(struct STUDENT *stud, int n)
{
struct STUDENT *p;
for(p=stud; p<stud+n;p++)
scanf("%ld%s%s",&p->SID,p->name,p->sex);
scanf("%d-%d-%d",&p->birthday.year,&p->birthday.month,&p->birthday.day);
for(int j=0;j<4;j++)
scanf("%f",&p->score[j]);
p->total = 0;
p->average = 0;
}
}

//此函数输出stud指针指向的结构体数组中n个学生的信息
//输出信息包括学生的学号,姓名,性别,出生年月日,4门功课的成绩,总分和平均分,名次
void Print(struct STUDENT *stud, int n)
{
puts(" NO. Name Sex Birthday Computer English Math Music Total Average Rank");
for(int i=0;i<n;i++)
printf("%8ld%10s%4s",stud[i].SID,stud[i].name,stud[i].sex);
printf("%6d-%02d-%02d",stud[i].birthday.year,stud[i].birthday.month,stud[i].birthday.day);
for(int j=0;j<4;j++)
printf("%7.0f",stud[i].score[j]);
printf("%6.0f%6.0f%5d\n",stud[i].total,stud[i].average,stud[i].rank);
}
}

//此函数为stud指针变量指向的结构体数组
//计算n个学生的总分和平均分,并放入相应的结构体成员变量中
void TotalAndAverage(struct STUDENT *stud, int n)
{
struct STUDENT *p;
int i;
for(p=stud;p<n+stud;p++)
{
for(i=0;i<4;i++)
p->total+=p->score[i];
p->average=(p->total)/4.0;
}
}

//此函数为stud指针变量指向的结构体数组
//计算每个学生的名次,放入相应的结构体成员变量中
//如若两个学生的总分相同,他们的名次也应相同
void RankByTotal(struct STUDENT *stud, int n)
{
}

运行结果及报错内容
5
20183001 张三 男 1999-9-1 90 83 72 82
20183002 李四 男 2000-10-25 78 92 88 78
20183003 王五 女 2001-12-1 89 72 98 68
20183004 侯六 女 2000-3-25 78 95 87 90
20183005 赵七 女 2001-6-18 72 89 96 68
—— 预期输出 ——

NO. Name Sex Birthday Computer English Math Music Total Average Rank
20183001 张三 男 1999-09-01 90 83 72 82 327 82 3
20183002 李四 男 2000-10-25 78 92 88 78 336 84 2
20183003 王五 女 2001-12-01 89 72 98 68 327 82 3
20183004 侯六 女 2000-03-25 78 95 87 90 350 88 1
20183005 赵七 女 2001-06-18 72 89 96 68 325 81 5

我的解答思路和尝试过的方法
最后的rank排名编号不会

我想要达到的结果
如何做到不打乱顺序对成绩进行排名。

指针p那里是for(p=stud;p<stud+n;p++)

有好多代码没粘贴完整

img