回答編集履歴
1
P.S.4から、ソートの考え方を回答の2番目の柱としてぬきだし、具体例を追加するなど。
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
|
-
|
133
|
+
という感じで、head から始まる一本のリストだけでソートしています。双方向リストなので、そのままコピペできませんが(むしろ、できないからこそw)ご紹介します。リスト操作の雰囲気を感じてください。
|
52
134
|
|
53
|
-
1. 結果となる空のリスト(dummy?)がある
|
54
|
-
|
55
|
-
|
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)ご紹介します。リスト操作の雰囲気を感じてください。加えて、リストの図を描かずにリスト操作はできないこともお忘れなく。
|