1 # include <stdio.h>
2 # include <stdlib.h>
3 typedef struct node
4 {
5 int data;
6 char a[20];
7 struct node *next;
8 }LINK;//定义链表。
9 LINK *creat(int n);//构造链表函数
10 LINK *sort(LINK *head);//对链表进行排序;
11 void print(LINK *head1);//链表的输出。
12 int main()
13 {
14 int n;
15 LINK *head,*head1;
16 scanf("%d",&n);
17 head=creat(n);
18 head1=sort(head);
19 print(head1);
20 printf("\n");
21 return 0;
22 }
23 LINK *creat(int n)
24 {
25 int i,m;
26 LINK *p,*head,*tail;//尾指针记录每次插入的位置。
27 head=(LINK *)malloc(sizeof(LINK));
28 head->next=NULL;
29 tail=head;
30 while(n--)
31 {
32 scanf("%d",&m);
33 for(i=1;i<=m;i++)
34 {
35 p=(LINK *)malloc(sizeof(LINK));
36 scanf("%s%d",p->a,&p->data);
37 p->next=NULL;
38 tail->next=p;
39 tail=p;
40 }
41 }
42 return head;
43 }
44 LINK *sort(LINK *head)
45 {
46 LINK *head1,*m,*p,*q;//head1记录排序后的头指针并且作为返回值。m始终是q的前一个节点,未删除做准备。
47 LINK *tail2,*tail1,*tail3;//tail1的用处为每次找到最大的之后插入到head1中。
48 //tail2,*tail3的作用为删除已经记录下的节点,为后来寻找第二大节点做准备。
49 int i,a,leag=1;//leag的作用为判断是否是把head链表的首部删除。
50 head1=(LINK *)malloc(sizeof(LINK));
51 head1->next=NULL;
52 tail1=head1;//初始化。
53 p=head->next;//确定p的值让q在head链表中变动开始找,若在中间部分找到,则删除tail2,*tail3
54 //记录的最大节点,之后再找第二大的。若p就是最大的则直接删除因此需要先把平,p,q的值用tail2,*tail3记录。
55 q=p;
56 m=head;
57 while(p!=NULL)
58 {
59 tail3=m;//记录值以防第一个p就是最大的。
60 tail2=p;//
61 a=p->data;
62 while(q!=NULL)
63 {
64 if(q->data>a)
65 {
66 tail2=q;//中间记录。
67 tail3=m;
68 a=q->data;
69 leag=0;//标记变量赋值
70 }
71 m=q;
72 q=q->next;
73 }
74 if(leag)
75 p=p->next;//if语句要在后边的语句之前。后移p,因为后边得删除p
76 tail3->next=tail2->next;//删除节点、
77 tail2->next=NULL;//tail2赋值NULL往head1上连接、
78 tail1->next=tail2;//连接
79 tail1=tail2;//尾节点后移。
80 q=p;//初始化。
81 m=p;
82 leag=1;
83 }
84 return head1;
85 }
86 void print(LINK *head1)
87 {
88 int i;
89 LINK *p;
90 p=head1->next;
91 while(p!=NULL)
92 {
93 printf("%s ",p->a);
94 p=p->next;
95 }
96 }