已有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链表中,插入的时候按照学号的顺序。算法的细节我还没有理解。

你可能感兴趣的:(链表)