単連結リストの整列 #55 整列処理に使えるか確認
前回書いた関数prev2をilist2.cに組み込み、適当にリストを整列させてみる。
ilist2.c
...snip static void prev2(ielem_p p1, ielem_p *pp1, ielem_p p2, ielem_p *pp2) { int b1 = 1, b2 = 1; ielem *q = &ilist; *pp1 = *pp2 = NULL; for (;;) { if (b1 && q->n == p1) { *pp1 = q; b1 = 0; } if (b2 && q->n == p2) { *pp2 = q; b2 = 0; } if ((b1 | b2) == 0) break; q = q->n; if (q == NULL) break; } } ...snip static void swap(void *list, void *p, void *q, void *listarg) { ...snip if (p == q) return; prev2((ielem_p)p, &pp, (ielem_p)q, &pq); if (q == pp) { ...snip
関数prevの定義を関数prev2の定義に置き換え、
prevを呼び出していた関数swap内の該当部分をprev2の呼び出しに変更しただけである。
以前にilist2を書いたときに一緒に書いた確認用のサンプルコードtest_ilist2に、
この変更後のilist2をリンクし動作させると、
$ ./test_ilist2 98 85 22 14 21 27 39 73 39 61 14 21 22 27 39 39 61 73 85 98
きちんと整列しているようだ。