単連結リストの整列 #16 整数を整列する

さっそくlsortを使って整列させてみる。
とりあえず、今までと同様にint型を要素が保持する場合について書いてみる。

test_lsort.c
#include <stdio.h>
#include "lsort.h"

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

typedef struct tag_int_node int_node_t;
struct tag_int_node {
    int_node_t *next;
    int val;
};

static int sup(const void *x, const void *y, void *arg)
{
    UNUSED_ARG(arg);
    return ((int_node_t *)x)->val > ((int_node_t *)y)->val;
}

static void print(int_node_t *node)
{
    int_node_t *p;
    for (p = node; p != NULL; p = p->next) {
        printf(p->next == NULL ? "%d\n" : "%d ", p->val);
    }
}

#define NNODES 5

int main(void)
{
    int i;
    int_node_t p[NNODES], *q, *node = p;
    for (i = 0, q = p; i < NNODES; i++) {
        p[i].next = i < NNODES - 1 ? ++q : NULL;
        p[i].val = NNODES - i;
    }
    print(node);
    lsort(&node, sup, NULL);
    print(node);
    return 0;
}

int型のメンバvalを持つint_node_t型が今回整列する単連結リストの要素である。
p[0]が先頭要素であり、&p[0]、すなわち p が先頭要素のアドレスである。
変数nodeは先頭要素のアドレスを保持するためにあり、
初期状態では、このpの値がアドレスとして格納されている。
関数lsortへはnodeのアドレスを第一引数として渡すことになる。
順位定義関数supでは順位比較にエクストラデータは不要なので、
lsortの第三引数にはNULLを渡しており、supでもその第三引数は使用していない。

実行すると、

5 4 3 2 1
1 2 3 4 5

昇順に整列した。