#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct student
{
char num[6];
char name[8];
int English;
int math;
int tax;//名次
int score;
struct student *next;
}JD;
void fread_list(JD *head)
{
FILE *fp;//定义文本文件指针
char str[128];
char num[6],name[8];
int English,math;
JD *s,*p;
head=(JD*)malloc(sizeof(JD));//定义结点并分配对应空间
p=head;//p指向head结点
fp=fopen("student.txt","r");//打开文本文件
if(fp!=NULL)
{
while((fgets(str,128,fp))!=NULL)
{
s=(JD *)malloc(sizeof(JD));
fscanf(str,"%s %s %d %d",p->num,p->name,&p->English,&p->math);
p->next=s;
p=s;
}
if(p->next=NULL)
fclose(fp);//关闭文件
}
}
void select_score(JD *head)//按照总分进行排名
{
JD *p,*k,*h,*g,*d;
p=head->next;//P指向链表head
while(p!=NULL)
{
p->score=p->English+p->math;//总分
p=p->next;
}
k=head->next;
head->next=NULL;//k为空
while(k)
{
h=k->next;
g=head;
d=head->next;
while(d&&d->score>k->score)//比较语句
{
g=d;
d=d->next;
}
k->next=g->next;
g->next=k;
k=h;
}
}
void output(JD *head)//输出函数
{
JD *temp;
int n;
head->next=temp;
while(1)
{
if(temp!=NULL)
{ n++;
temp->tax=n;//学号前面加名次
printf("%d %s %s %d %d",temp->tax,temp->num,temp->name,temp->English,temp->math);
}temp=temp->next;
}printf("\n");
}
void main()
{
JD *head;
fread_list(head);
output(head);
select_score(head);
}