题目描述
请用链表完成下面题目要求。
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 <stdlib.h> #include <string.h> struct Node { char name[20]; int data; struct Node *next; }*head,*p; int num; void creat()//创建链表 { struct Node *ls,*x,*y;//创建临时变量 ls=(struct Node *)malloc(sizeof(struct Node)); x=(struct Node *)malloc(sizeof(struct Node)); y=(struct Node *)malloc(sizeof(struct Node));//给变量开内存 scanf("%s%d",ls->name,&ls->data); x=head->next;//每次从头开始 y=head;//记录x的上一个节点,以便于插入节点 while(x!=NULL) { if(ls->data>x->data)//如果当前输入比x->data大的话,就放到x->data的前面每一次都进行此操作,保证链表按从大到小的顺序建立 { y->next=ls; ls->next=x; break; } if(ls->data==x->data) { if(strcmp(ls->name,x->name)<0)//如果当前输入和某一个相等,则按字典顺序排序 { y->next=ls; ls->next=p; } } y=x; x=x->next; } if(x==NULL)//如果当前输入比链表中已有的任何一个都小,就放到最后 { y->next=ls; ls->next=NULL;//尾指针指向空,是链表结束的标志 } } int main() { int n=0,k=0,i=0; head=(struct Node *)malloc(sizeof(struct Node)); head->next=NULL; p=(struct Node *)malloc(sizeof(struct Node)); num=0; scanf("%d",&n); while(n--) { scanf("%d",&k); while(k--) { creat(); } } p=head->next; while(p!=NULL) { printf("%s",p->name); if(p->next!=NULL) { printf(" "); } p=p->next; } printf("\n"); return 0; }
快排算法:(C++)(经验证,冒泡排序法,选择排序法都会TLE)
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <algorithm> using namespace std; struct node { char name[20]; int data; }s[10010]; int cmp(struct node a,struct node b) { if(a.data>b.data) { return 1; } else if(a.data==b.data) { if(strcmp(a.name,b.name)<0) { return 1; } else { return 0; } } else { return 0; } } int main() { int n=0,k=0,i=0,sum=0; scanf("%d",&n); while(n--) { scanf("%d%*c",&k); sum+=k; while(k--) { scanf("%s%d",s[i].name,&s[i].data); i++; } } sort(s,s+sum,cmp); for(i=0;i<sum;i++) { printf("%s",s[i].name); if(i<sum-1) { printf(" "); } } printf("\n"); return 0; }
我就想到了这两种解法,比较一下,还是快排简单些,就是那个cmp函数有些复杂...