整理音乐
Time Limit: 1000MS Memory limit: 65536K
题目描述
请用链表完成下面题目要求。
xiaobai 很喜欢音乐,几年来一直在收集好听的专辑。他有个习惯,每次在听完一首音乐后会给这首音乐打分,而且会隔一段时间给打好分的音乐排一个名次。今天 xiaobai 打开自己的音乐文件夹,发现有很多不同时期打过分的排好序的子音乐文件夹,他想把这些音乐放到一块,组成一个分数有序的序列。由于音乐文件很多,而文件里音乐的数目也是不确定的,怎么帮帮 xiaobai 完成这件工作呢?
输入
输入数据第一行为一个整数n(n<1000),代表文件夹的数量。接下来是n个文件夹的信息,每个文件夹信息的第一行是一个数字m,代表这个文件夹里有m首歌,后面m行每行一个歌曲名、分数,之间用空格分开。
输出
输出一行,为所有音乐组成的一个序列,音乐只输出名字。
如果音乐分数相同则按照音乐名字典序进行排序。
示例输入
3 4 aaa 60 aab 50 aac 40 aad 30 2 kkk 60 kkd 59 3 qow 70 qwe 60 qqw 20
示例输出
qow aaa kkk qwe kkd aab aac aad qqw
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node
{
int socre;
char name[31];
struct node *next;
}node,*Node;
Node build(Node head,int m)
{
Node tail,p;
tail=head;
while(m--)
{
p=(node*)malloc(sizeof(node));
scanf("%s %d",&p->name,&p->socre);
tail->next=p;
tail=p;
}
tail->next=NULL;
return tail;
}
int main()
{
int i,n,m;
Node tail,head,max;
head=(node*)malloc(sizeof(node));
head->next=NULL;
scanf("%d",&n);
tail=head;
int sum=0;
for(i=0;i<n;i++)
{
scanf("%d%*c",&m);
sum+=m;
tail=build(tail,m);
}
max=(node*)malloc(sizeof(node));
tail->next=max;
max->next=NULL;
max->socre=0;
sum--;
for(i=0;i<sum;i++)
{
max=head->next;
for(tail=head->next;tail->next!=NULL;tail=tail->next)
{
if(tail->socre>max->socre)
max=tail;
if(tail->socre==max->socre)
if(strcmp(tail->name,max->name)<0)
max=tail;
}
printf("%s ",max->name);
max->socre=0;
}
for(tail=head->next;tail!=NULL;tail=tail->next)
if(tail->socre)
{
printf("%s\n",tail->name);
break;
}
return 0;
}