質問するログイン新規登録

回答編集履歴

4

訂正

2018/01/28 05:35

投稿

nullpon
nullpon

スコア5739

answer CHANGED
@@ -8,7 +8,7 @@
8
8
  > if (p == 0)
9
9
  > break;
10
10
 
11
- リストが残り1つの場合、ソートが完了したとして、ループを抜けます。
11
+ おそらく、リストが残り1つの場合、ソートが完了したとして、ループを抜けます。
12
12
 
13
13
  > exchange(head, p);
14
14
  > //大小を入れ替える

3

訂正

2018/01/28 05:35

投稿

nullpon
nullpon

スコア5739

answer CHANGED
@@ -23,4 +23,5 @@
23
23
  1. リストheadから要素pを引っこ抜いて、抜けた部分を繋ぎ直す。
24
24
  2. リストheadの先頭に要素pを追加して、要素pを新しいリストの先頭にする。
25
25
  > if (&((*p)->next) == q || &((*q)->next) == p) {
26
+
26
27
  尚、この条件ではリストの先頭要素と要素pが隣り合っているかどうかチェックしていますが、ポインタのつなぎ替えの順番を工夫すれば、1つにまとめることも可能です。

2

追記

2018/01/28 03:34

投稿

nullpon
nullpon

スコア5739

answer CHANGED
@@ -8,7 +8,7 @@
8
8
  > if (p == 0)
9
9
  > break;
10
10
 
11
- おそらく、リストが残り1つの場合、ソートが完了したとして、ループを抜けます。
11
+ リストが残り1つの場合、ソートが完了したとして、ループを抜けます。
12
12
 
13
13
  > exchange(head, p);
14
14
  > //大小を入れ替える
@@ -17,4 +17,10 @@
17
17
 
18
18
  > head = &((*head)->next);
19
19
 
20
- ループの最後では、先頭の次の要素を新たな先頭にして、処理を繰り返します。
20
+ ループの最後では、先頭の次の要素を新たな先頭にして、処理を繰り返します。
21
+
22
+ で、関数exchange(head, p)の中身ですが、以下の処理を行っています。
23
+ 1. リストheadから要素pを引っこ抜いて、抜けた部分を繋ぎ直す。
24
+ 2. リストheadの先頭に要素pを追加して、要素pを新しいリストの先頭にする。
25
+ > if (&((*p)->next) == q || &((*q)->next) == p) {
26
+ 尚、この条件ではリストの先頭要素と要素pが隣り合っているかどうかチェックしていますが、ポインタのつなぎ替えの順番を工夫すれば、1つにまとめることも可能です。

1

追記

2018/01/28 03:32

投稿

nullpon
nullpon

スコア5739

answer CHANGED
@@ -3,4 +3,18 @@
3
3
  > //(*head)->nameと(*head)->next)のnameとを比べて
4
4
  > //小さいほうのポインタのポインタを返却値にしている。
5
5
 
6
- 関数listmin(head)は、リストの全ての要素をチェックして、いちばん小さいnameを持つ要素を返していると思われます。そうでないと正しくソートされません。
6
+ 関数listmin(head)は、名前からリストの全ての要素をチェックして、いちばん小さいnameを持つ要素を返していると思われます。そうでないと正しくソートされません。
7
+
8
+ > if (p == 0)
9
+ > break;
10
+
11
+ おそらく、リストが残り1つの場合、ソートが完了したとして、ループを抜けます。
12
+
13
+ > exchange(head, p);
14
+ > //大小を入れ替える
15
+
16
+ ここでは、見つけたいちばん小さい要素を関数exchange(head, p)で先頭に移動しています。
17
+
18
+ > head = &((*head)->next);
19
+
20
+ ループの最後では、先頭の次の要素を新たな先頭にして、処理を繰り返します。