すでにa,bの2つのチェーンテーブルがあり、各チェーンテーブルのノードには学号、成績が含まれている.2つのチェーンテーブルを結合し、学号昇順に並べることを要求する.


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.選択法でソートする過程で、2つのノードを交換する必要がある場合、ノードの有用なデータしか交換できないことに注意し、ノードの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チェーンテーブルに順次挿入し、挿入するときは学号の順にする.アルゴリズムの詳細はまだ理解していません.