単連結リストの整列 #22 名前とスコアが要素のリストの操作のためのインタフェイス

このリストを操作するための最低限のインタフェイスを考えてみる。

sclist.h
#ifndef SCLIST_H_INCLUDED
#define SCLIST_H_INCLUDED

typedef struct tag_sclist *sclist_t;
typedef struct tag_scdata *scdata_t;
typedef struct tag_sciter *sciter_t;

sclist_t sclist_new(void);
void sclist_dispose(sclist_t list);
int sclist_add(sclist_t list, const char *name, int score);
sciter_t sclist_iterator(const sclist_t list);
void sclist_sort(sclist_t list, int (*issup)(const void *, const void *, void *), void *arg);

const char *scdata_get_name(const scdata_t data);
int scdata_get_score(const scdata_t data);

int sciter_has_next(const sciter_t iter);
scdata_t sciter_next(const sciter_t iter);

#endif /* SCLIST_H_INCLUDED */

名前がsclistで始まる関数は基本的にリスト型sclist_tを最初の引数にとり、
リストそのものに関連する操作を行う。
newで作成、disposeで廃棄、addでデータを追加、sortで整列する。
また、iteratorはリストを走査する反復子を返す。

scdataで始まる関数はリスト要素型scdata_tを引数にとり、
要素に格納された名前とスコアの情報をそれぞれ取得する。

sciterで始まる関数は関数sclist_iteratorで得た反復子を引数とし、
has_nextが走査対象の要素が残っているか否かを返し、
nextはリストの要素を一つ返す。

これだけではリストを操作するには要素の削除や任意の位置への追加等、機能が十分ではないが、
前に述べたように目的は別のところにあるのでまあいいだろう。