すでにa,bの2つのチェーンテーブルがあり、各チェーンテーブルのノードには学号、成績が含まれている.2つのチェーンテーブルを結合し、学号昇順に並べることを要求する.
16774 ワード
1.私の考えでは、まずbチェーンテーブルをaチェーンテーブルの後ろに接続します.これは簡単に実現できます.aチェーンテーブルの最後のノードのp.nextをbチェーンテーブルを指すヘッドノードに変更すればいいです.
この新しいチェーンテーブルを選択でソートすればいいです.
コードは次のとおりです.
注意事項:
1.選択法でソートする過程で、2つのノードを交換する必要がある場合、ノードの有用なデータしか交換できないことに注意し、ノードのnextメンバーは変動できない.そうしないと、チェーンテーブルの接続関係に影響する.
2.チェーンテーブルを作成する関数では、headをNULLに初期化する必要があります.そうでなければ、確立されたチェーンテーブルが空のチェーンテーブルである場合、return headは不確定な値を返します.
プログラムの実行結果は次のとおりです.
2.譚浩強の答えの本の上でこのように処理しました:
aチェーンテーブルとbチェーンテーブルを関数insertに渡し、関数のアルゴリズムはbチェーンテーブルのノードをaチェーンテーブルに順次挿入し、挿入するときは学号の順にする.アルゴリズムの詳細はまだ理解していません.
この新しいチェーンテーブルを選択でソートすればいいです.
コードは次のとおりです.
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チェーンテーブルに順次挿入し、挿入するときは学号の順にする.アルゴリズムの詳細はまだ理解していません.