単連結リストの整列 #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

きちんと整列しているようだ。