#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);
}