1.我的思路先将b链表连接在a链表的后面,这个很容易实现,将a链表最后的结点中的p.next改为指向b链表的头结点即可。
再将这个新链表用选择排序即可。
代码如下:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<malloc.h> 4 5 typedef struct student{ 6 int num; 7 float score; 8 struct student *next; 9 } STU; 10 11 int main(){ 12 setbuf(stdout,NULL); 13 STU *creat(); 14 void print(STU *head); 15 STU *head_a,*head_b,*p1,*p2,*pmin; 16 int num_temp; 17 float score_temp; 18 printf("Input the records of a: "); 19 head_a=creat(); 20 printf("a: "); 21 print(head_a); 22 printf("Input the records of b: "); 23 head_b=creat(); 24 printf("b: "); 25 print(head_b); 26 27 for(p1=head_a;p1!=NULL;p1=p1->next) //27~29行连接两个链表。 28 p2=p1; 29 p2->next=head_b; 30 31 printf("After connected: "); 32 print(head_a); 33 34 for(p1=head_a;p1->next!=NULL;p1=p1->next) 35 { 36 pmin=p1; 37 for(p2=p1->next;p2!=NULL;p2=p2->next) 38 if(p2->num<pmin->num) 39 pmin=p2; 40 if(pmin!=p1) 41 { 42 num_temp=p1->num; 43 p1->num=pmin->num; 44 pmin->num=num_temp; 45 46 score_temp=p1->score; 47 p1->score=pmin->score; 48 pmin->score=score_temp; 49 } 50 } 51 printf("After sorted: "); 52 print(head_a); 53 return 0; 54 } 55 56 STU *creat(){ 57 STU *p1,*p2,*head=NULL; 58 int n=0; 59 p1=(STU *)malloc(sizeof(STU)); 60 p2=p1; 61 scanf("%d%f",&p1->num,&p1->score); 62 while(p1->num!=0) 63 { 64 n++; 65 if(n==1) 66 head=p1; 67 else 68 p2->next=p1; 69 p2=p1; 70 p1=(STU *)malloc(sizeof(STU)); 71 scanf("%d%f",&p1->num,&p1->score); 72 } 73 p2->next=NULL; 74 return head; 75 } 76 77 void print(STU *head){ 78 STU *p1; 79 if(head==NULL) 80 { 81 printf("NULL list! "); 82 return; 83 } 84 else 85 { 86 for(p1=head;p1!=NULL;p1=p1->next) 87 printf("%d,%.2f ",p1->num,p1->score); 88 } 89 }
注意事项:
1.用选择法进行排序的过程中,需要交换两个结点时,注意只能交换结点中的有用数据,结点中的next成员不能变动,否则会影响链表的连接关系;
2.建立链表的函数中,head一定要初始化为NULL。否则当建立的链表为空链表时,return head返回的值为不确定的值。
程序的执行结果如下:
Input the records of a: 110 85 130 96 150 75 0 0 a: 110,85.00 130,96.00 150,75.00 Input the records of b: 100 96 120 75 140 96 0 0 b: 100,96.00 120,75.00 140,96.00 After connected: 110,85.00 130,96.00 150,75.00 100,96.00 120,75.00 140,96.00 After sorted: 100,96.00 110,85.00 120,75.00 130,96.00 140,96.00 150,75.00
2.谭浩强答案书上时这样处理的:
1 STU *insert(STU *head_a,STU *head_b){ 2 STU *pa1,*pa2,*pb1,*pb2; 3 pa2=pa1=head_a; 4 pb2=pb1=head_b; 5 do{ 6 while((pb1->num>pa1->num)&&(pa1->next!=NULL)) 7 { 8 pa2=pa1; 9 pa1=pa1->next; 10 } 11 if(pb1->num<=pa1->num) 12 { 13 if(head_a==pa1) 14 head_a=pb1; 15 else 16 pa2->next=pb1; 17 pb1=pb1->next; 18 pb2->next=pa1; 19 pa2=pb2; 20 pb2=pb1; 21 } 22 }while((pa1->next!=NULL)||(pa1==NULL&&pb1!=NULL)); 23 if((pb1!=NULL)&&(pb1->num>pa1->num)&&(pa1->next==NULL)) 24 pa1->next=pb1; 25 return(head_a); 26 }
将a链表和b链表传递给函数insert,函数的算法是将b链表中的结点依次插入a链表中,插入的时候按照学号的顺序。算法的细节我还没有理解。