リストは 3 つのデータ構造の中で最も単純であり、 上記の機能のみをサポートする。
テールキューは以下の機能を追加する:
ただし:
循環キューは以下の機能を追加する:
ただし:
マクロ定義において Fa TYPE はユーザ定義構造体の名前であり、 LIST_ENTRY TAILQ_ENTRY CIRCLEQ_ENTRY の何れか型のフィールドと 指定された Fa NAME を含まなければならない。 引き数 Fa HEADNAME はユーザ定義構造体の名前であり、 マクロ LIST_HEAD TAILQ_HEAD CIRCLEQ_HEAD を用いて宣言されなければならない。 これらのマクロがどのように使われるかについての更なる説明は、 以下の例を参照すること。
LIST_HEAD(HEADNAME, TYPE) head;
ここで Fa HEADNAME は定義される構造体の名前であり、 Fa TYPE はリンク内でリンクされる要素の型である。 リストの先頭へのポインタは、その後で次のように宣言される:
struct HEADNAME *headp;
(名前 head と headp はユーザが選択できる。)
マクロ LIST_ENTRY はリストの要素を接続する構造体を宣言する。
マクロ LIST_INIT は Fa head で参照されるリストを初期化する。
マクロ LIST_INSERT_HEAD は新たな要素 Fa elm をリストの先頭に挿入する。
マクロ LIST_INSERT_AFTER は新たな要素 Fa elm を要素 Fa listelm の後に挿入する。
マクロ LIST_REMOVE は要素 Fa elm をリストから削除する。
LIST_HEAD(listhead, entry) head; struct listhead *headp; /* リストの先頭。*/ struct entry { ... LIST_ENTRY(entry) entries; /* リスト。*/ ... } *n1, *n2, *np; LIST_INIT(&head); /* リストを初期化する。*/ n1 = malloc(sizeof(struct entry)); /* 先頭に挿入する。*/ LIST_INSERT_HEAD(&head, n1, entries); n2 = malloc(sizeof(struct entry)); /* 後ろに挿入する。*/ LIST_INSERT_AFTER(n1, n2, entries); /* 順方向に辿る。*/ for (np = head.lh_first; np != NULL; np = np->entries.le_next) np-> ... while (head.lh_first != NULL) /* 削除する。*/ LIST_REMOVE(head.lh_first, entries);
TAILQ_HEAD(HEADNAME, TYPE) head;
ここで HEADNAME は定義される構造体の名前であり、 TYPE はテールキュー内でリンクされる要素の型である。 テールキューの先頭へのポインタは、その後で次のように宣言される:
struct HEADNAME *headp;
(名前 head と headp はユーザが選択できる。)
マクロ TAILQ_ENTRY はテールキューの要素を接続する構造体を宣言する。
マクロ TAILQ_INIT は Fa head で参照されるテールキューを初期化する。
マクロ TAILQ_INSERT_HEAD は新たな要素 Fa elm をテールキューの先頭に挿入する。
マクロ TAILQ_INSERT_TAIL は新たな要素 Fa elm をテールキューの末尾に挿入する。
マクロ TAILQ_INSERT_AFTER は新たな要素 Fa elm を要素 Fa listelm の後に挿入する。
マクロ TAILQ_REMOVE は要素 Fa elm をテールキューから削除する。
TAILQ_HEAD(tailhead, entry) head; struct tailhead *headp; /* テールキューの先頭。*/ struct entry { ... TAILQ_ENTRY(entry) entries; /* テールキュー。*/ ... } *n1, *n2, *np; TAILQ_INIT(&head); /* キューを初期化する。*/ n1 = malloc(sizeof(struct entry)); /* 先頭に挿入する。*/ TAILQ_INSERT_HEAD(&head, n1, entries); n1 = malloc(sizeof(struct entry)); /* 末尾に挿入する。*/ TAILQ_INSERT_TAIL(&head, n1, entries); n2 = malloc(sizeof(struct entry)); /* 後ろに挿入する。*/ TAILQ_INSERT_AFTER(&head, n1, n2, entries); /* 順方向に辿る。*/ for (np = head.tqh_first; np != NULL; np = np->entries.tqe_next) np-> ... /* 削除する。*/ while (head.tqh_first != NULL) TAILQ_REMOVE(&head, head.tqh_first, entries);
CIRCLEQ_HEAD(HEADNAME, TYPE) head;
ここで HEADNAME は定義される構造体の名前であり、 TYPE は循環キュー内でリンクされる要素の型である。 循環キューの先頭へのポインタは、その後で次のように宣言される:
struct HEADNAME *headp;
(名前 head と headp はユーザが選択できる。)
マクロ CIRCLEQ_ENTRY は循環キューの要素を接続する構造体を宣言する。
マクロ CIRCLEQ_INIT は Fa head で参照される循環キューを初期化する。
マクロ CIRCLEQ_INSERT_HEAD は新たな要素 Fa elm を循環キューの先頭に挿入する。
マクロ CIRCLEQ_INSERT_TAIL は新たな要素 Fa elm を循環キューの末尾に挿入する。
マクロ CIRCLEQ_INSERT_AFTER は新たな要素 Fa elm を要素 Fa listelm の後に挿入する。
マクロ CIRCLEQ_INSERT_AFTER は新たな要素 Fa elm を要素 Fa listelm の前に挿入する。
マクロ CIRCLEQ_REMOVE は要素 Fa elm を循環キューから削除する。
CIRCLEQ_HEAD(circleq, entry) head; struct circleq *headp; /* 循環キューの先頭。*/ struct entry { ... CIRCLEQ_ENTRY(entry) entries; /* 循環キュー。*/ ... } *n1, *n2, *np; CIRCLEQ_INIT(&head); /* 循環キューを初期化する。*/ n1 = malloc(sizeof(struct entry)); /* 先頭に挿入する。*/ CIRCLEQ_INSERT_HEAD(&head, n1, entries); n1 = malloc(sizeof(struct entry)); /* 末尾に挿入する。*/ CIRCLEQ_INSERT_TAIL(&head, n1, entries); n2 = malloc(sizeof(struct entry)); /* 後ろに挿入する。*/ CIRCLEQ_INSERT_AFTER(&head, n1, n2, entries); n2 = malloc(sizeof(struct entry)); /* 前に挿入する。*/ CIRCLEQ_INSERT_BEFORE(&head, n1, n2, entries); /* 順方向に辿る。*/ for (np = head.cqh_first; np != (void *)&head; np = np->entries.cqe_next) np-> ... /* 逆方向に辿る。*/ for (np = head.cqh_last; np != (void *)&head; np = np->entries.cqe_prev) np-> ... /* 削除する。*/ while (head.cqh_first != (void *)&head) CIRCLEQ_REMOVE(&head, head.cqh_first, entries);