回答編集履歴

2

説明の追加

2021/05/17 10:24

投稿

kazuma-s
kazuma-s

スコア8224

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

コードの修正

2021/05/17 10:24

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -122,7 +122,7 @@
122
122
 
123
123
  else {
124
124
 
125
- for (a = p = less; p && p->next; p = p->next) ;
125
+ for (a = p = less; p->next; p = p->next) ;
126
126
 
127
127
  p->next = pivot;
128
128