已有a,b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列

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:\n");
19     head_a=creat();
20     printf("a:\n");
21     print(head_a);
22     printf("Input the records of b:\n");
23     head_b=creat();
24     printf("b:\n");
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:\n");
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:\n");
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!\n");
82         return;
83     }
84     else
85     {
86         for(p1=head;p1!=NULL;p1=p1->next)
87             printf("%d,%.2f\n",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链表中,插入的时候按照学号的顺序。算法的细节我还没有理解。

posted @ 2013-10-26 20:11  Andy Cheung  阅读(3144)  评论(0编辑  收藏  举报