単連結リストの整列 #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でリストの後始末をする。