C语言
题目描述
有N个学生的数据,将学生数据按成绩从低到高排序,如果成绩相同则按姓名字符的字母序依次排序,如果姓名的字母序也相同则按照学生的年龄从小到大排序,并输出N个学生排序后的信息。
输入格式
测试数据有多组,每组输入第一行有一个整数N(N<=1000),接下来的N行包括N个学生的数据。
每个学生的数据包括姓名(长度不超过100的字符串)、年龄(整形数)、成绩(小于等于100的正数)。
输出格式
将学生信息按成绩进行排序,成绩相同的则按姓名的字母序进行排序。
然后输出学生信息,按照如下格式:
姓名 年龄 成绩
样例输入
复制
3 zhao 19 90 qian 20 90 sun 19 100
样例输出
复制
qian 20 90 zhao 19 90 sun 19 100
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct LN{
char name[101];
int age;
double grade;
struct LN *next;
}*ln,LN;
void swap(ln,ln);//交换
int main(){
int n;
while(scanf("%d",&n)!=EOF){
getchar();
ln head=(ln)malloc(sizeof(LN));
head->next=NULL;
ln p=head;
ln q;
for(int i=1;i<=n;i++)
{
q=(ln)malloc(sizeof(LN));
scanf("%s%d%lf",(*q).name,&(*q).age,&(*q).grade);
getchar();
p->next=q;
q->next=NULL;
p=q;
}
p=head->next;
while(p){//类似冒泡排序
q=p->next;
while(q){
swap(p,q);
q=q->next;
}
p=p->next;
}
p=head->next;
while(p){
printf("%s %d %.0lf\n",p->name,p->age,p->grade);
p=p->next;
}
}
}
void swap(ln p,ln q){//这里一定要注意判断的先后顺序
char tname[101];
int tage;
int tgrade;
if(p->grade>q->grade){
strcpy(tname,p->name);
tage=p->age;
tgrade=p->grade;
strcpy(p->name,q->name);
p->age=q->age;
p->grade=q->grade;
strcpy(q->name,tname);
q->age=tage;
q->grade=tgrade;
}
else if(p->grade==q->grade){
if(strcmp(p->name,q->name)>0){//字符串比较函数
strcpy(tname,p->name);
tage=p->age;
tgrade=p->grade;
strcpy(p->name,q->name);
p->age=q->age;
p->grade=q->grade;
strcpy(q->name,tname);
q->age=tage;
q->grade=tgrade;
}
else if(strcmp(p->name,q->name)==0){
if(p->age>q->age){
strcpy(tname,p->name);
tage=p->age;
tgrade=p->grade;
strcpy(p->name,q->name);
p->age=q->age;
p->grade=q->grade;
strcpy(q->name,tname);
q->age=tage;
q->grade=tgrade;
}
}
}
}