単連結リストの整列 #8 リストとのインタフェイス

書いてきたコードを整理する。
まずはリストとその利用者とのインタフェイスを定める。

list.h
#ifndef LIST_H_INCLUDED
#define LIST_H_INCLUDED

typedef struct tag_list *list_t;

list_t list_new(void);
void list_dispose(list_t list);
int list_add(list_t list, int val);
void list_print(list_t list);
void list_sort(list_t list);

#endif /* LIST_H_INCLUDED */

リスト自身は不透過型にしておく。
実験的コードでのリストの要素そのものを表すnode_t型と異なり、
list_t型はリストの実体自体ではなく、それへのポインタ型である。
このリストを処理するための関数をいくつか宣言する。
各関数はnode_tのものと同じような機能を持つ。
このインタフェイスは次のような使い方を想定している。

test_list.c
#include <stdlib.h>
#include <time.h>
#include "list.h"

static void add_randnums(list_t list)
{
    int i;
    for (i = 0; i < 20; i++) list_add(list, (int)(rand() / (RAND_MAX + 1.0) * 900) + 100);
}

int main(void)
{
    list_t list = list_new();
    srand(time(NULL));
    add_randnums(list);
    list_print(list);
    list_sort(list);
    list_print(list);
    list_dispose(list);
    return 0;
}

list_newで要素を持たないリストを新規に作成し、
20個の3桁の乱数をlistに加え、要素の整列前後でのその並びを表示する。
最後にlist_disposeでリストの後始末をする。