回答編集履歴

1

P.S.4から、ソートの考え方を回答の2番目の柱としてぬきだし、具体例を追加するなど。

2019/06/21 04:30

投稿

rubato6809
rubato6809

スコア1380

test CHANGED
@@ -11,6 +11,78 @@
11
11
  要するに、**list_sort()がダメダメ**です。見るからに、ソートになっていません(後述)。
12
12
 
13
13
  eclipseならlist_sort()関数をトレースできるのではありませんか?誤ったリスト構造を返すことを、ご自分で確かめてみましょう。
14
+
15
+
16
+
17
+ > ソートプログラムを実現したいのですが、if文中でのソートの実装方法がわからないため、ご教授いただきたい
18
+
19
+
20
+
21
+ 質問者のイメージと違うかもしれませんが、リスト構造のソートは大まかに次のような手順になると思います。
22
+
23
+
24
+
25
+ 0. ソートしたいリスト(frontから始まるリスト)がある
26
+
27
+ 1. 結果となる空のリスト(dummy?)がある
28
+
29
+ 2. front から要素を一つ取出し、結果となるリストdummyの、しかるべき位置に挿入する
30
+
31
+ 3. front に要素が無くなるまで 3. の処理を繰り返す。
32
+
33
+
34
+
35
+ これだけだと一重のループに思えるかもしれませんが、
36
+
37
+ - しかるべき挿入位置を決める
38
+
39
+ - 取り出す要素を決める
40
+
41
+
42
+
43
+ の、どちらかがループになるので、ソート処理は2重ループで実現されるはずです。こう考えれば、一重のループでしかない list_sort()ではソートできないだろうと予想できます。
44
+
45
+
46
+
47
+ 「取り出す要素を決める」方式の具体例を示します。
48
+
49
+ ```
50
+
51
+ front -> B -> F -> A -> D -> C -> E -> NULL
52
+
53
+ dummy -> NULL
54
+
55
+ ```
56
+
57
+ このリストで最小(最奥)になるべき要素は、リストを先頭から見ていき F が見つかりますので、F を取出し、dummy に挿入します。
58
+
59
+ ```
60
+
61
+ front -> B -> A -> D -> C -> E -> NULL
62
+
63
+ dummy -> F -> NULL
64
+
65
+ ```
66
+
67
+ 次は E を取出し dummy に挿入する、その次は D ・・・と進めて
68
+
69
+ ```
70
+
71
+ front -> B -> A -> C -> NULL
72
+
73
+ dummy -> D -> E -> F -> NULL
74
+
75
+ ```
76
+
77
+ となっていく。最終的に dummy にソートされた結果ができるという次第。
78
+
79
+ ```
80
+
81
+ front -> NULL
82
+
83
+ dummy -> A -> B -> C -> D -> E -> F -> NULL
84
+
85
+ ```
14
86
 
15
87
 
16
88
 
@@ -44,32 +116,20 @@
44
116
 
45
117
  P.S.4
46
118
 
119
+ 少しだけ違うソートプログラム[(「いちいち書いた」同等のコード)](https://teratail.com/questions/111407)
120
+
47
- リスト構造のソートは大まかに次のような手順になる思います。
121
+ を作ったこがあります。この中の sort_list() は、
122
+
123
+ - 今の場所(ap ポインタが指している要素)から先を見て
124
+
125
+ - 最小の要素を探して
126
+
127
+ - それを取出し
128
+
129
+ - 今見ている場所に挿入する(挿入し直す)
48
130
 
49
131
 
50
132
 
51
- 0. ソートしいリスト(frontからリスト)がある
133
+ という感じで、head から始まる一本のリストだけでソートします。双方向リストなので、そのままコピペできませんがむしろ、できないからこそw)ご紹介しす。リスト操作の雰囲気を感じてください。
52
134
 
53
- 1. 結果となる空のリスト(dummy?)がある
54
-
55
- 2. front から要素を一つ取出し結果となるリストdummy、しかる位置挿入する
135
+ 加えて、リストの図を描ずにリスト操作はできません。図も描いてあので描方を参考していただきたく。
56
-
57
- 3. front に要素が無くなるまで 3. の処理を繰り返す。
58
-
59
-
60
-
61
- これだけだと一重のループに思えるかもしれませんが、
62
-
63
- - しかるべき挿入位置を決める
64
-
65
- - 取り出す要素を決める
66
-
67
-
68
-
69
- の、どちらかがループになるので、ソート処理は2重ループで実現されるはずです。こう考えれば、一重のループでしかない list_sort()ではソートできないだろうと予想できます。
70
-
71
-
72
-
73
- 少しだけ違うソートプログラム[(「いちいち書いた」同等のコード)](https://teratail.com/questions/111407)
74
-
75
- を作ったことがあります。そのままコピペしても動かないと思うけど(むしろ、動かないからこそw)ご紹介します。リスト操作の雰囲気を感じてください。加えて、リストの図を描かずにリスト操作はできないこともお忘れなく。