链表专练—整理音乐
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 }