単連結リストの整列 #52 要素のアドレスを晒していないので

以前に行ったようにインタフェイスを介さずに参照からリストの情報を見たり操作したりできるだろうか。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "ilist3.h"

#define UNUSED_ARG(x) (void)(x)

static int issup(ielem_t p, ielem_t q, void *arg)
{
    UNUSED_ARG(arg);
    return ival(p) > ival(q);
}

static void print(void)
{
    ielem_t p;
    for (p = ihead(); iisvalid(p); p = inext(p)) printf("%2d:%d ", p, ival(p));
    putchar('\n');
}

int main(void)
{
    srand(time(NULL));
    iinit();
    print();
    isort(issup, NULL);
    print();
    return 0;
}

これを実行すると、

 1:57  2:36  3:14  4:72  5:31  6:89  7:62  8:86  9:58 10:69
 3:14  5:31  2:36  1:57  9:58  7:62 10:69  4:72  8:86  6:89

整列前後のリストについて「参照値:要素の値」の形で先頭の要素から順に表示している。
参照は簡単な整数となっており、
以前のようにアドレスとみなして要素に直接アクセスするようなことはできそうにない。
公開されたインタフェイスから得られる情報のみを利用して、
インタフェイスを介さない情報取得や操作を行うようなカジュアルハックは行えないだろう。