回答編集履歴
2
説明の追加
test
CHANGED
@@ -241,3 +241,127 @@
|
|
241
241
|
```
|
242
242
|
|
243
243
|
バグがあるかもしれません。どうでしょうか?
|
244
|
+
|
245
|
+
|
246
|
+
|
247
|
+
**追記**
|
248
|
+
|
249
|
+
コードの説明です。
|
250
|
+
|
251
|
+
変数名{変数の値}。値がポインタの時は * で -> の先のオブジェクトを指す。
|
252
|
+
|
253
|
+
->{構造体の値} は一つ前の * で指されるオブジェクト。
|
254
|
+
|
255
|
+
|
256
|
+
|
257
|
+
head{*}->{1,"ccc",*}->{2,"aaa",*}->{3,"ddd",*}->{4,"bbb",NULL}
|
258
|
+
|
259
|
+
というリストができたとする。
|
260
|
+
|
261
|
+
|
262
|
+
|
263
|
+
quick_sort に入ると、
|
264
|
+
|
265
|
+
a{*}->{1,"ccc",*}->{2,"aaa",*}->{3,"ddd",*}->{4,"bbb",NULL}
|
266
|
+
|
267
|
+
|
268
|
+
|
269
|
+
pivot = a, a = a->next, pivot->next = NULL; を実行すると、
|
270
|
+
|
271
|
+
pivot{*}->{1,"ccc",NULL}
|
272
|
+
|
273
|
+
a{*}->{2,"aaa",*}->{3,"ddd",*}->{4,"bbb",NULL}
|
274
|
+
|
275
|
+
|
276
|
+
|
277
|
+
a のリストの先頭から順番に取り外し、
|
278
|
+
|
279
|
+
pivot の "ccc" より小さい name のものを less リストに追加し、
|
280
|
+
|
281
|
+
pivot の "ccc" より大きい name のものを greater リストに追加する
|
282
|
+
|
283
|
+
ということを繰り返す。
|
284
|
+
|
285
|
+
|
286
|
+
|
287
|
+
int diff = strcmp(a->name, pivot->name); を実行すると、
|
288
|
+
|
289
|
+
"aaa" < "ccc" だから diff は負の値で、a の先頭を less に追加する。
|
290
|
+
|
291
|
+
add(less) は、 p = a, a = a->next, p->next = less, less = p なので、
|
292
|
+
|
293
|
+
p{*}->{2,"aaa",NULL} (less は NULL だったので)
|
294
|
+
|
295
|
+
a{*}->{3,"ddd",*}->{4,"bbb",NULL}
|
296
|
+
|
297
|
+
less{*}->{2,"aaa",NULL}
|
298
|
+
|
299
|
+
|
300
|
+
|
301
|
+
int diff = strcmp(a->name, pivot->name); を実行すると、
|
302
|
+
|
303
|
+
"ddd" > "ccc" だから diff は正の値で、a の先頭を greater に追加する。
|
304
|
+
|
305
|
+
add(greater) は、 p = a, a = a->next, p->next = greater, greater = p なので、
|
306
|
+
|
307
|
+
p{*}->{3,"ddd",NULL} (greater は NULL だったので)
|
308
|
+
|
309
|
+
a{*}->{4,"bbb",NULL}
|
310
|
+
|
311
|
+
greater{*}->{3,"ddd",NULL}
|
312
|
+
|
313
|
+
|
314
|
+
|
315
|
+
int diff = strcmp(a->name, pivot->name); を実行すると、
|
316
|
+
|
317
|
+
"bbb" < "ccc" だから diff は負の値で、a の先頭を less に追加する。
|
318
|
+
|
319
|
+
add(less) は、 p = a, a = a->next, p->next = less, less = p なので、
|
320
|
+
|
321
|
+
p{*}->{4,"bbb",*}->{2,"aaa",NULL} (less の先頭に追加)
|
322
|
+
|
323
|
+
a{NULL}
|
324
|
+
|
325
|
+
less{*}->{4,"bbb",*}->{2,"aaa",NULL}
|
326
|
+
|
327
|
+
|
328
|
+
|
329
|
+
a が NULL なので、while (a) のループを終了
|
330
|
+
|
331
|
+
|
332
|
+
|
333
|
+
less = quick_sort(less) で less をソート
|
334
|
+
|
335
|
+
less{*}->{2,"aaa",*}->{4,"bbb",NULL}
|
336
|
+
|
337
|
+
|
338
|
+
|
339
|
+
greater = quick_sort(greater) で greater をソート
|
340
|
+
|
341
|
+
greater{*}->{3,"ddd",NULL}
|
342
|
+
|
343
|
+
|
344
|
+
|
345
|
+
|
346
|
+
|
347
|
+
less が NULL なら、a は pivot + greater となるが、
|
348
|
+
|
349
|
+
less が NULL でないので、a = less とし、
|
350
|
+
|
351
|
+
less と pivot と greater を結合して a を作る。
|
352
|
+
|
353
|
+
for (p = less; p->next; p = p->next) ; で、
|
354
|
+
|
355
|
+
p が less の最後の要素を指すようにする。
|
356
|
+
|
357
|
+
p->next = pivot で less の最後に pivot を連結する。
|
358
|
+
|
359
|
+
for (p = pivot; p->next; p = p->next) ; で、
|
360
|
+
|
361
|
+
p が pivot の最後の要素を指すようにする。
|
362
|
+
|
363
|
+
p->next = greater で pivot の最後に greater を連結する。
|
364
|
+
|
365
|
+
|
366
|
+
|
367
|
+
return a; でソートと連結が完了したリストを返す。
|
1
コードの修正
test
CHANGED
@@ -122,7 +122,7 @@
|
|
122
122
|
|
123
123
|
else {
|
124
124
|
|
125
|
-
for (a = p = less; p
|
125
|
+
for (a = p = less; p->next; p = p->next) ;
|
126
126
|
|
127
127
|
p->next = pivot;
|
128
128
|
|