整理音乐(链表排序输出,(输出有序,但是非排序))

整理音乐

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

原文地址:https://www.cnblogs.com/kongkaikai/p/3014549.html