对于输入的若干学生的信息,按学号顺序从小到大建立有序链表,最后遍历链表,并按顺序输出学生信息。
输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据首先输入一个正整数n(1≤n≤100),表示学生的个数。然后输入n行信息,分别是学生的学号和姓名,其中,学号是8位的正整数(保证各不相同),姓名是长度不超过10且不含空格的字符串。
输出格式:
对于每组测试,按顺序输出学生信息,学号和姓名之间留一个空格(参看输出样例)。
输入样例:
1
3
20080108 Zhangsan
20070328 Lisi
20070333 Wangwu
输出样例:
20070328 Lisi
20070333 Wangwu
20080108 Zhangsan
先看第一种链表的方法:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct stu{
int num;
char name[100];
struct stu *next;
};
int main(){
int n=0,m,i=0,j=0;
scanf("%d",&n);
while(i<n){
struct stu *head=NULL,*p,*tail,*q,*index,temp;
scanf("%d",&m);
for(j=0;j<m;j++){
p=(struct stu *)malloc(sizeof(struct stu ));
scanf("%d %s",&p->num,p->name);
if(head==NULL) head=tail=p;
else{
tail->next=p;
}
tail=p;
}
tail->next=NULL;
i++;
for(p=head;p!=NULL;p=p->next){
for(q=p->next;q!=NULL;q=q->next){
if(q->num<p->num){
temp.num=p->num;
strcpy(temp.name,p->name);
p->num=q->num;
strcpy(p->name,q->name);
q->num=temp.num;
strcpy(q->name,temp.name);
}
}
}
for(p=head;p!=NULL;p=p->next){
printf("%d %s\n",p->num,p->name);
}
}
return 0;
}
链表方法比较麻烦,思维要求较高
第二种非链表方法:
#include<stdio.h>
struct liu{
int a;
char b[100];
};
int main(){
int n;
scanf("%d",&n);
int i,j,m;
struct liu t;
struct liu c[100];
for(i=0;i<n;i++){
scanf("%d",&m);
for(j=0;j<m;j++){
scanf("%d %s",&c[j].a,c[j].b);
}
for(j=0;j<m-1;j++){
for(int l=0;l<m-1-j;l++){
if(c[l].a>c[l+1].a){
t=c[l];
c[l]=c[l+1];
c[l+1]=t;
}
}
}
for(j=0;j<m;j++)
printf("%d %s\n",c[j].a,c[j].b);
}
}
希望对你们有所帮助!