queue(3) - wariua/manpages-ko GitHub Wiki

NAME

SLIST_EMPTY, SLIST_ENTRY, SLIST_FIRST, SLIST_FOREACH, SLIST_HEAD, SLIST_HEAD_INITIALIZER, SLIST_INIT, SLIST_INSERT_AFTER, SLIST_INSERT_HEAD, SLIST_NEXT, SLIST_REMOVE_HEAD, SLIST_REMOVE, STAILQ_CONCAT, STAILQ_EMPTY, STAILQ_ENTRY, STAILQ_FIRST, STAILQ_FOREACH, STAILQ_HEAD, STAILQ_HEAD_INITIALIZER, STAILQ_INIT, STAILQ_INSERT_AFTER, STAILQ_INSERT_HEAD, STAILQ_INSERT_TAIL, STAILQ_NEXT, STAILQ_REMOVE_HEAD, STAILQ_REMOVE, LIST_EMPTY, LIST_ENTRY, LIST_FIRST, LIST_FOREACH, LIST_HEAD, LIST_HEAD_INITIALIZER, LIST_INIT, LIST_INSERT_AFTER, LIST_INSERT_BEFORE, LIST_INSERT_HEAD, LIST_NEXT, LIST_REMOVE, TAILQ_CONCAT, TAILQ_EMPTY, TAILQ_ENTRY, TAILQ_FIRST, TAILQ_FOREACH, TAILQ_FOREACH_REVERSE, TAILQ_HEAD, TAILQ_HEAD_INITIALIZER, TAILQ_INIT, TAILQ_INSERT_AFTER, TAILQ_INSERT_BEFORE, TAILQ_INSERT_HEAD, TAILQ_INSERT_TAIL, TAILQ_LAST, TAILQ_NEXT, TAILQ_PREV, TAILQ_REMOVE, TAILQ_SWAP - ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ, ๋‹จ์ผ ์—ฐ๊ฒฐ ๊ผฌ๋ฆฌ ํ, ๋ฆฌ์ŠคํŠธ, ๊ผฌ๋ฆฌ ํ ๊ตฌํ˜„

SYNOPSIS

#include <sys/queue.h>

SLIST_EMPTY(SLIST_HEAD *head);

SLIST_ENTRY(TYPE);

SLIST_FIRST(SLIST_HEAD *head);

SLIST_FOREACH(TYPE *var, SLIST_HEAD *head, SLIST_ENTRY NAME);

SLIST_HEAD(HEADNAME, TYPE);

SLIST_HEAD_INITIALIZER(SLIST_HEAD head);

SLIST_INIT(SLIST_HEAD *head);

SLIST_INSERT_AFTER(TYPE *listelm, TYPE *elm, SLIST_ENTRY NAME);

SLIST_INSERT_HEAD(SLIST_HEAD *head, TYPE *elm, SLIST_ENTRY NAME);

SLIST_NEXT(TYPE *elm, SLIST_ENTRY NAME);

SLIST_REMOVE_HEAD(SLIST_HEAD *head, SLIST_ENTRY NAME);

SLIST_REMOVE(SLIST_HEAD *head, TYPE *elm, TYPE, SLIST_ENTRY NAME);

STAILQ_CONCAT(STAILQ_HEAD *head1, STAILQ_HEAD *head2);

STAILQ_EMPTY(STAILQ_HEAD *head);

STAILQ_ENTRY(TYPE);

STAILQ_FIRST(STAILQ_HEAD *head);

STAILQ_FOREACH(TYPE *var, STAILQ_HEAD *head, STAILQ_ENTRY NAME);

STAILQ_HEAD(HEADNAME, TYPE);

STAILQ_HEAD_INITIALIZER(STAILQ_HEAD head);

STIALQ_INIT(STAILQ_HEAD *head);

STAILQ_INSERT_AFTER(STAILQ_HEAD *head, TYPE *listelm, TYPE *elm,
    STAILQ_ENTRY NAME);

STAILQ_INSERT_HEAD(STAILQ_HEAD *head, TYPE *elm, STAILQ_ENTRY NAME);

STAILQ_INSERT_TAIL(STAILQ_HEAD *head, TYPE *elm, STAILQ_ENTRY NAME);

STAILQ_NEXT(TYPE *elm, STAILQ_ENTRY NAME);

STAILQ_REMOVE_HEAD(STAILQ_HEAD *head, STAILQ_ENTRY NAME);

STAILQ_REMOVE(STAILQ_HEAD *head, TYPE *elm, TYPE, STAILQ_ENTRY NAME);

LIST_EMPTY(LIST_HEAD *head);

LIST_ENTRY(TYPE);

LIST_FIRST(LIST_HEAD *head);

LIST_FOREACH(TYPE *var, LIST_HEAD *head, LIST_ENTRY NAME);

LIST_HEAD(HEADNAME, TYPE);

LIST_HEAD_INITIALIZER(LIST_HEAD head);

LIST_INIT(LIST_HEAD *head);

LIST_INSERT_AFTER(TYPE *listelm, TYPE *elm, LIST_ENTRY NAME);

LIST_INSERT_BEFORE(TYPE *listelm, TYPE *elm, LIST_ENTRY NAME);

LIST_INSERT_HEAD(LIST_HEAD *head, TYPE *elm, LIST_ENTRY NAME);

LIST_NEXT(TYPE *elm, LIST_ENTRY NAME);

LIST_REMOVE(TYPE *elm, LIST_ENTRY NAME);

LIST_SWAP(LIST_HEAD *head1, LIST_HEAD *head2, TYPE, LIST_ENTRY NAME);

TAILQ_CONCAT(TAILQ_HEAD *head1, TAILQ_HEAD *head2, TAILQ_ENTRY NAME);

TAILQ_EMPTY(TAILQ_HEAD *head);

TAILQ_ENTRY(TYPE);

TAILQ_FIRST(TAILQ_HEAD *head);

TAILQ_FOREACH(TYPE *var, TAILQ_HEAD *head, TAILQ_ENTRY NAME);

TAILQ_FOREACH_REVERSE(TYPE *var, TAILQ_HEAD *head, HEADNAME, TAILQ_ENTRY NAME);

TAILQ_HEAD(HEADNAME, TYPE);

TAILQ_HEAD_INITIALIZER(TAILQ_HEAD head);

TAILQ_INIT(TAILQ_HEAD *head);

TAILQ_INSERT_AFTER(TAILQ_HEAD *head, TYPE *listelm, TYPE *elm),
    TAILQ_ENTRY NAME);

TAILQ_INSERT_BEFORE(TYPE *listelm, TYPE *elm, TAILQ_ENTRY NAME);

TAILQ_INSERT_HEAD(TAILQ_HEAD *head, TYPE *elm, TAILQ_ENTRY NAME);

TAILQ_INSERT_TAIL(TAILQ_HEAD *head, TYPE *elm, TAILQ_ENTRY NAME);

TAILQ_LAST(TAILQ_HEAD *head, HEADNAME);

TAILQ_NEXT(TYPE *elm, TAILQ_ENTRY NAME);

TAILQ_PREV(TYPE *elm, HEADNAME, TAILQ_ENTRY NAME);

TAILQ_REMOVE(TAILQ_HEAD *head, TYPE *elm, TAILQ_ENTRY NAME);

TAILQ_SWAP(TAILQ_HEAD *head1, TAILQ_HEAD *head2, TYPE, TAILQ_ENTRY NAME);

DESCRIPTION

์ด ๋งคํฌ๋กœ๋“ค์€ ๋„ค ๊ฐ€์ง€ ์ž๋ฃŒ ๊ตฌ์กฐ(๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ, ๋‹จ์ผ ์—ฐ๊ฒฐ ๊ผฌ๋ฆฌ ํ, ๋ฆฌ์ŠคํŠธ, ๊ผฌ๋ฆฌ ํ)์— ๋Œ€ํ•ด ์ •์˜๋˜์–ด ๋™์ž‘ํ•œ๋‹ค. ๋„ค ๊ฐ€์ง€ ๊ตฌ์กฐ ๋ชจ๋‘ ๋‹ค์Œ ๊ธฐ๋Šฅ์„ฑ์„ ์ง€์›ํ•œ๋‹ค.

  1. ๋ฆฌ์ŠคํŠธ ๋จธ๋ฆฌ์— ์ƒˆ ํ•ญ๋ชฉ ์‚ฝ์ž…ํ•˜๊ธฐ.
  2. ๋ฆฌ์ŠคํŠธ ๋‚ด ์ž„์˜ ํ•ญ๋ชฉ ๋’ค์— ์ƒˆ ํ•ญ๋ชฉ ์‚ฝ์ž…ํ•˜๊ธฐ.
  3. ๋ฆฌ์ŠคํŠธ ๋จธ๋ฆฌ์—์„œ O(1)์œผ๋กœ ํ•ญ๋ชฉ ์ œ๊ฑฐํ•˜๊ธฐ.
  4. ์ˆœ๋ฐฉํ–ฅ์œผ๋กœ ๋ฆฌ์ŠคํŠธ ์ˆœํšŒํ•˜๊ธฐ.
  5. ๋‘ ๋ฆฌ์ŠคํŠธ์˜ ๋‚ด์šฉ ์„œ๋กœ ๋ฐ”๊พธ๊ธฐ.

๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ๋„ค ๊ฐ€์ง€ ์ž๋ฃŒ ๊ตฌ์กฐ ์ค‘ ๊ฐ€์žฅ ๋‹จ์ˆœํ•˜๋ฉฐ ์œ„ ๊ธฐ๋Šฅ๋“ค๋งŒ ์ง€์›ํ•œ๋‹ค. ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ๋ฐ์ดํ„ฐ ์–‘์ด ๋งŽ๊ณ  ์ œ๊ฑฐ๊ฐ€ ์—†๋Š” ์‘์šฉ์—, ๋˜๋Š” LIFO ํ ๊ตฌํ˜„์— ์ž˜ ๋งž๋Š”๋‹ค. ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—๋Š” ์ถ”๊ฐ€๋กœ ๋‹ค์Œ ๊ธฐ๋Šฅ์„ฑ์ด ์žˆ๋‹ค.

  1. ๋ฆฌ์ŠคํŠธ ๋‚ด ์ž„์˜ ํ•ญ๋ชฉ์„ O(n)์œผ๋กœ ์ œ๊ฑฐํ•˜๊ธฐ.

๋‹จ์ผ ์—ฐ๊ฒฐ ๊ผฌ๋ฆฌ ํ์—๋Š” ์ถ”๊ฐ€๋กœ ๋‹ค์Œ ๊ธฐ๋Šฅ์„ฑ์ด ์žˆ๋‹ค.

  1. ๋ฆฌ์ŠคํŠธ ๋์— ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ๋ฆฌ์ŠคํŠธ ๋‚ด ์ž„์˜ ํ•ญ๋ชฉ์„ O(n)์œผ๋กœ ์ œ๊ฑฐํ•˜๊ธฐ.
  3. ๋‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์–ด ๋ถ™์ผ ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ

  1. ๋ฆฌ์ŠคํŠธ ์‚ฝ์ž… ์‹œ ๋ฆฌ์ŠคํŠธ ๋จธ๋ฆฌ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.
  2. ๊ฐ ๋จธ๋ฆฌ ํ•ญ๋ชฉ์— ํฌ์ธํ„ฐ๊ฐ€ ํ•œ ๊ฐœ๊ฐ€ ์•„๋‹ˆ๋ผ ๋‘ ๊ฐœ ํ•„์š”ํ•˜๋‹ค.
  3. ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์™€ ๋น„๊ตํ•  ๋•Œ ์ฝ”๋“œ ํฌ๊ธฐ๊ฐ€ 15% ์ •๋„ ํฌ๊ณ  ๋™์ž‘์ด 20% ์ •๋„ ๋А๋ฆฌ๋‹ค.

๋‹จ์ผ ์—ฐ๊ฒฐ ๊ผฌ๋ฆฌ ํ๋Š” ๋ฐ์ดํ„ฐ ์–‘์ด ๋งŽ๊ณ  ์‚ญ์ œ๊ฐ€ ๋“œ๋ฌผ๊ฑฐ๋‚˜ ์—†๋Š” ์‘์šฉ์—, ๋˜๋Š” FIFO ํ ๊ตฌํ˜„์— ์ž˜ ๋งž๋Š”๋‹ค.

์ด์ค‘ ์—ฐ๊ฒฐ ๋ฐฉ์‹ ์ž๋ฃŒ ๊ตฌ์กฐ ๋ชจ๋‘(๋ฆฌ์ŠคํŠธ์™€ ๊ผฌ๋ฆฌ ํ)์—์„œ๋Š” ์ถ”๊ฐ€๋กœ ๋‹ค์Œ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

  1. ๋ฆฌ์ŠคํŠธ ๋‚ด ์ž„์˜ ํ•ญ๋ชฉ ์•ž์— ์ƒˆ ํ•ญ๋ชฉ ์‚ฝ์ž…ํ•˜๊ธฐ.
  2. ๋ฆฌ์ŠคํŠธ ๋‚ด ์ž„์˜ ํ•ญ๋ชฉ์„ O(1)์œผ๋กœ ์ œ๊ฑฐํ•˜๊ธฐ.

ํ•˜์ง€๋งŒ

  1. ๊ฐ ํ•ญ๋ชฉ์— ํฌ์ธํ„ฐ๊ฐ€ ํ•œ ๊ฐœ๊ฐ€ ์•„๋‹ˆ๋ผ ๋‘ ๊ฐœ ํ•„์š”ํ•˜๋‹ค.
  2. ์ฝ”๋“œ ํฌ๊ธฐ์™€ (์ œ๊ฑฐ๋ฅผ ์ œ์™ธํ•œ) ์‹คํ–‰ ์‹œ๊ฐ„์ด ๋‹จ์ผ ์—ฐ๊ฒฐ ์ž๋ฃŒ ๊ตฌ์กฐ์˜ ๋‘ ๋ฐฐ ์ •๋„์ด๋‹ค.

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ์ด์ค‘ ์—ฐ๊ฒฐ ์ž๋ฃŒ ๊ตฌ์กฐ์ด๋‹ค. ์œ„์—๋‹ค ์ถ”๊ฐ€๋กœ ๋‹ค์Œ ๊ธฐ๋Šฅ์„ฑ์ด ์žˆ๋‹ค.

  1. ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ

  1. ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ์ˆœํšŒํ•˜๋ ค๋ฉด ์ˆœํšŒ๋ฅผ ์‹œ์ž‘ํ•  ํ•ญ๋ชฉ๊ณผ ๊ทธ ํ•ญ๋ชฉ์„ ๋‹ด์€ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.

๊ผฌ๋ฆฌ ํ์—๋Š” ์ถ”๊ฐ€๋กœ ๋‹ค์Œ ๊ธฐ๋Šฅ์„ฑ์ด ์žˆ๋‹ค.

  1. ๋ฆฌ์ŠคํŠธ ๋์— ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ๊ผฌ๋ฆฌ์—์„œ ๋จธ๋ฆฌ๋กœ ์—ญ๋ฐฉํ–ฅ ์ˆœํšŒ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. ๋‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์–ด ๋ถ™์ผ ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ

  1. ๋ฆฌ์ŠคํŠธ ์‚ฝ์ž… ๋ฐ ์ œ๊ฑฐ ์‹œ ๋ฆฌ์ŠคํŠธ ๋จธ๋ฆฌ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.
  2. ๊ฐ ๋จธ๋ฆฌ ํ•ญ๋ชฉ์— ํฌ์ธํ„ฐ๊ฐ€ ํ•œ ๊ฐœ๊ฐ€ ์•„๋‹ˆ๋ผ ๋‘ ๊ฐœ ํ•„์š”ํ•˜๋‹ค.
  3. ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์™€ ๋น„๊ตํ•  ๋•Œ ์ฝ”๋“œ ํฌ๊ธฐ๊ฐ€ 15% ์ •๋„ ํฌ๊ณ  ๋™์ž‘์ด 20% ์ •๋„ ๋А๋ฆฌ๋‹ค.

๋งคํฌ๋กœ ์ •์˜์—์„œ TYPE์€ ์‚ฌ์šฉ์ž ์ •์˜ ๊ตฌ์กฐ์ฒด์˜ ์ด๋ฆ„์ด๋ฉฐ ๊ทธ ๊ตฌ์กฐ์ฒด์—๋Š” ์ด๋ฆ„์ด NAME์ด๊ณ  ํƒ€์ž…์ด SLIST_ENTRY, STAILQ_ENTRY, LIST_ENTRY, TAILQ_ENTRY ์ค‘ ํ•˜๋‚˜์ธ ํ•„๋“œ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ธ์ž HEADNAME์€ ์‚ฌ์šฉ์ž ์ •์˜ ๊ตฌ์กฐ์ฒด์˜ ์ด๋ฆ„์ด๋ฉฐ ๋งคํฌ๋กœ SLIST_HEAD, STAILQ_HEAD, LIST_HEAD, TAILQ_HEAD ์ค‘ ํ•˜๋‚˜๋กœ ๊ทธ ๊ตฌ์กฐ์ฒด๋ฅผ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค. ์ด ๋งคํฌ๋กœ ์‚ฌ์šฉ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์„ค๋ช…์€ ์•„๋ž˜์˜ ์˜ˆ์‹œ๋“ค์„ ์ฐธ๊ณ ํ•˜๋ผ.

๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ

๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋จธ๋ฆฌ๋Š” SLIST_HEAD ๋งคํฌ๋กœ๋กœ ์ •์˜ํ•œ ๊ตฌ์กฐ์ฒด์ด๋‹ค. ์ด ๊ตฌ์กฐ์ฒด์—๋Š” ๋ฆฌ์ŠคํŠธ ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ ํ•˜๋‚˜๊ฐ€ ์žˆ๋‹ค. ๊ณต๊ฐ„ ๋ฐ ํฌ์ธํ„ฐ ์กฐ์ž‘ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋‹จ์ผ ์—ฐ๊ฒฐ๋กœ ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๋Œ€์‹  ์ž„์˜ ํ•ญ๋ชฉ ์ œ๊ฑฐ์— O(n) ๋น„์šฉ์ด ๋“ ๋‹ค. ๊ธฐ์กด ํ•ญ๋ชฉ ๋’ค๋‚˜ ๋ฆฌ์ŠคํŠธ ๋จธ๋ฆฌ์— ์ƒˆ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. SLIST_HEAD ๊ตฌ์กฐ์ฒด๋ฅผ ๋‹ค์Œ์ฒ˜๋Ÿผ ์„ ์–ธํ•œ๋‹ค.

SLIST_HEAD(HEADNAME, TYPE) head;

HEADNAME์€ ์ •์˜ํ•˜๋ ค๋Š” ๊ตฌ์กฐ์ฒด์˜ ์ด๋ฆ„์ด๊ณ  TYPE์€ ๋ฆฌ์ŠคํŠธ๋กœ ์—ฐ๊ฒฐํ•  ํ•ญ๋ชฉ๋“ค์˜ ํƒ€์ž…์ด๋‹ค. ์ดํ›„ ๋‹ค์Œ์ฒ˜๋Ÿผ ๋ฆฌ์ŠคํŠธ ๋จธ๋ฆฌ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.

struct HEADNAME *headp;

(์ด๋ฆ„ head์™€ headp๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.)

๋งคํฌ๋กœ SLIST_HEAD_INITIALIZER๋Š” ๋ฆฌ์ŠคํŠธ head๋ฅผ ์œ„ํ•œ ์ดˆ๊ธฐํ™” ๊ฐ’์œผ๋กœ ํ‰๊ฐ€๋œ๋‹ค.

๋งคํฌ๋กœ SLIST_EMPTY๋Š” ๋ฆฌ์ŠคํŠธ์— ํ•ญ๋ชฉ์ด ์—†์œผ๋ฉด ์ฐธ์œผ๋กœ ํ‰๊ฐ€๋œ๋‹ค.

๋งคํฌ๋กœ SLIST_ENTRY๋Š” ๋ฆฌ์ŠคํŠธ์—์„œ ํ•ญ๋ชฉ๋“ค์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ ์„ ์–ธํ•œ๋‹ค.

๋งคํฌ๋กœ SLIST_FIRST๋Š” ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด ์žˆ์œผ๋ฉด NULL์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋งคํฌ๋กœ SLIST_FOREACH๋Š” head๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœ๋ฐฉํ–ฅ์œผ๋กœ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ ํ•ญ๋ชฉ์„ ์ฐจ๋ก€๋กœ var์— ํ• ๋‹นํ•œ๋‹ค.

๋งคํฌ๋กœ SLIST_INIT์€ head๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค.

๋งคํฌ๋กœ SLIST_INSERT_HEAD๋Š” ์ƒˆ ํ•ญ๋ชฉ elm์„ ๋ฆฌ์ŠคํŠธ์˜ ๋จธ๋ฆฌ์— ์‚ฝ์ž…ํ•œ๋‹ค.

๋งคํฌ๋กœ SLIST_INSERT_AFTER๋Š” ์ƒˆ ํ•ญ๋ชฉ elm์„ ํ•ญ๋ชฉ listelm ๋’ค์— ์‚ฝ์ž…ํ•œ๋‹ค.

๋งคํฌ๋กœ SLIST_NEXT๋Š” ๋ฆฌ์ŠคํŠธ ๋‚ด์˜ ๋‹ค์Œ ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋งคํฌ๋กœ SLIST_REMOVE_HEAD๋Š” ํ•ญ๋ชฉ elm์„ ๋ฆฌ์ŠคํŠธ์˜ ๋จธ๋ฆฌ์—์„œ ์ œ๊ฑฐํ•œ๋‹ค. ์ตœ๊ณ ์˜ ํšจ์œจ์„ฑ์„ ์œ„ํ•ด์„  ๋ฆฌ์ŠคํŠธ์˜ ๋จธ๋ฆฌ์—์„œ ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•  ๋•Œ ๋ฒ”์šฉ SLIST_REMOVE ๋งคํฌ๋กœ ๋Œ€์‹  ๋ช…์‹œ์ ์œผ๋กœ ์ด ๋งคํฌ๋กœ๋ฅผ ์“ฐ๋Š” ๊ฒŒ ์ข‹๋‹ค.

๋งคํฌ๋กœ SLIST_REMOVE๋Š” ํ•ญ๋ชฉ elm์„ ๋ฆฌ์ŠคํŠธ์—์„œ ์ œ๊ฑฐํ•œ๋‹ค.

๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์˜ˆ์‹œ

SLIST_HEAD(slisthead, entry) head =
    SLIST_HEAD_INITIALIZER(head);
struct slisthead *headp;                /* ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๋จธ๋ฆฌ */

struct entry {
        ...
        SLIST_ENTRY(entry) entries;     /* ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ */
        ...
} *n1, *n2, *n3, *np;

SLIST_INIT(&head);                      /* ๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™” */

n1 = malloc(sizeof(struct entry));      /* ๋จธ๋ฆฌ์— ์‚ฝ์ž… */
SLIST_INSERT_HEAD(&head, n1, entries);

n2 = malloc(sizeof(struct entry));      /* ๋ฐ”๋กœ ๋’ค์— ์‚ฝ์ž… */
SLIST_INSERT_AFTER(n1, n2, entries);

SLIST_REMOVE(&head, n2, entry, entries);/* ์‚ญ์ œ */
free(n2);

n3 = SLIST_FIRST(&head);
SLIST_REMOVE_HEAD(&head, entries);      /* ๋จธ๋ฆฌ์—์„œ ์‚ญ์ œ */
free(n3);

SLIST_FOREACH(np, &head, entries)
        np-> ...

while (!SLIST_EMPTY(&head)) {           /* ๋ฆฌ์ŠคํŠธ ์‚ญ์ œ */
        n1 = SLIST_FIRST(&head);
        SLIST_REMOVE_HEAD(&head, entries);
        free(n1);
}

๋‹จ์ผ ์—ฐ๊ฒฐ ๊ผฌ๋ฆฌ ํ

๋‹จ์ผ ์—ฐ๊ฒฐ ๊ผฌ๋ฆฌ ํ์˜ ๋จธ๋ฆฌ๋Š” STAILQ_HEAD ๋งคํฌ๋กœ๋กœ ์ •์˜ํ•œ ๊ตฌ์กฐ์ฒด์ด๋‹ค. ์ด ๊ตฌ์กฐ์ฒด์—๋Š” ํฌ์ธํ„ฐ ํ•œ ์Œ์ด ์žˆ๋Š”๋ฐ, ํ•˜๋‚˜๋Š” ๊ผฌ๋ฆฌ ํ์˜ ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๊ผฌ๋ฆฌ ํ์˜ ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ๊ณต๊ฐ„ ๋ฐ ํฌ์ธํ„ฐ ์กฐ์ž‘ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋‹จ์ผ ์—ฐ๊ฒฐ๋กœ ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๋Œ€์‹  ์ž„์˜ ํ•ญ๋ชฉ ์ œ๊ฑฐ์— O(n) ๋น„์šฉ์ด ๋“ ๋‹ค. ๊ธฐ์กด ํ•ญ๋ชฉ ๋’ค์—, ๋˜๋Š” ๊ผฌ๋ฆฌ ํ ๋จธ๋ฆฌ๋‚˜ ๊ผฌ๋ฆฌ ํ ๋์— ์ƒˆ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. STAILQ_HEAD ๊ตฌ์กฐ์ฒด๋ฅผ ๋‹ค์Œ์ฒ˜๋Ÿผ ์„ ์–ธํ•œ๋‹ค.

STAILQ_HEAD(HEADNAME, TYPE) head;

HEADNAME์€ ์ •์˜ํ•˜๋ ค๋Š” ๊ตฌ์กฐ์ฒด์˜ ์ด๋ฆ„์ด๊ณ  TYPE์€ ๊ผฌ๋ฆฌ ํ๋กœ ์—ฐ๊ฒฐํ•  ํ•ญ๋ชฉ๋“ค์˜ ํƒ€์ž…์ด๋‹ค. ์ดํ›„ ๋‹ค์Œ์ฒ˜๋Ÿผ ๊ผฌ๋ฆฌ ํ ๋จธ๋ฆฌ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.

struct HEADNAME *headp;

(์ด๋ฆ„ head์™€ headp๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.)

๋งคํฌ๋กœ STAILQ_HEAD_INITIALIZER๋Š” ๊ผฌ๋ฆฌ ํ head๋ฅผ ์œ„ํ•œ ์ดˆ๊ธฐํ™” ๊ฐ’์œผ๋กœ ํ‰๊ฐ€๋œ๋‹ค.

๋งคํฌ๋กœ STAILQ_CONCAT์€ head2๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ผฌ๋ฆฌ ํ๋ฅผ head1์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ผฌ๋ฆฌ ํ ๋์— ์ด์–ด ๋ถ™์ด๊ณ  head2์—์„œ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•œ๋‹ค.

๋งคํฌ๋กœ STAILQ_EMPTY๋Š” ๊ผฌ๋ฆฌ ํ์— ํ•ญ๋ชฉ์ด ์—†์œผ๋ฉด ์ฐธ์œผ๋กœ ํ‰๊ฐ€๋œ๋‹ค.

๋งคํฌ๋กœ STAILQ_ENTRY๋Š” ๊ผฌ๋ฆฌ ํ์—์„œ ํ•ญ๋ชฉ๋“ค์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ ์„ ์–ธํ•œ๋‹ค.

๋งคํฌ๋กœ STAILQ_FIRST๋Š” ๊ผฌ๋ฆฌ ํ์˜ ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ๊ผฌ๋ฆฌ ํ๊ฐ€ ๋น„์–ด ์žˆ์œผ๋ฉด NULL์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋งคํฌ๋กœ STAILQ_FOREACH๋Š” head๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ผฌ๋ฆฌ ํ๋ฅผ ์ˆœ๋ฐฉํ–ฅ์œผ๋กœ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ ํ•ญ๋ชฉ์„ ์ฐจ๋ก€๋กœ var์— ํ• ๋‹นํ•œ๋‹ค.

๋งคํฌ๋กœ STAILQ_INIT์€ head๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ผฌ๋ฆฌ ํ๋ฅผ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค.

๋งคํฌ๋กœ STAILQ_INSERT_HEAD๋Š” ์ƒˆ ํ•ญ๋ชฉ elm์„ ๊ผฌ๋ฆฌ ํ์˜ ๋จธ๋ฆฌ์— ์‚ฝ์ž…ํ•œ๋‹ค.

๋งคํฌ๋กœ STAILQ_INSERT_TAIL์€ ์ƒˆ ํ•ญ๋ชฉ elm์„ ๊ผฌ๋ฆฌ ํ์˜ ๋์— ์‚ฝ์ž…ํ•œ๋‹ค.

๋งคํฌ๋กœ STAILQ_INSERT_AFTER๋Š” ์ƒˆ ํ•ญ๋ชฉ elm์„ ํ•ญ๋ชฉ listelm ๋’ค์— ์‚ฝ์ž…ํ•œ๋‹ค.

๋งคํฌ๋กœ STAILQ_NEXT๋Š” ๊ผฌ๋ฆฌ ํ ๋‚ด์˜ ๋‹ค์Œ ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ํ˜„ ํ•ญ๋ชฉ์ด ๋งˆ์ง€๋ง‰์ด๋ฉด NULL์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋งคํฌ๋กœ STAILQ_REMOVE_HEAD๋Š” ํ•ญ๋ชฉ elm์„ ๊ผฌ๋ฆฌ ํ์˜ ๋จธ๋ฆฌ์—์„œ ์ œ๊ฑฐํ•œ๋‹ค. ์ตœ๊ณ ์˜ ํšจ์œจ์„ฑ์„ ์œ„ํ•ด์„  ๊ผฌ๋ฆฌ ํ์˜ ๋จธ๋ฆฌ์—์„œ ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•  ๋•Œ ๋ฒ”์šฉ STAILQ_REMOVE ๋งคํฌ๋กœ ๋Œ€์‹  ๋ช…์‹œ์ ์œผ๋กœ ์ด ๋งคํฌ๋กœ๋ฅผ ์“ฐ๋Š” ๊ฒŒ ์ข‹๋‹ค.

๋งคํฌ๋กœ STAILQ_REMOVE๋Š” ํ•ญ๋ชฉ elm์„ ๊ผฌ๋ฆฌ ํ์—์„œ ์ œ๊ฑฐํ•œ๋‹ค.

๋‹จ์ผ ์—ฐ๊ฒฐ ๊ผฌ๋ฆฌ ํ ์˜ˆ์‹œ

STAILQ_HEAD(stailhead, entry) head =
    STAILQ_HEAD_INITIALIZER(head);
struct stailhead *headp;                /* ๋‹จ์ผ ์—ฐ๊ฒฐ ๊ผฌ๋ฆฌ ํ ๋จธ๋ฆฌ */
struct entry {
        ...
        STAILQ_ENTRY(entry) entries;    /* ๊ผฌ๋ฆฌ ํ */
        ...
} *n1, *n2, *n3, *np;

STAILQ_INIT(&head);                     /* ํ ์ดˆ๊ธฐํ™” */

n1 = malloc(sizeof(struct entry));      /* ๋จธ๋ฆฌ์— ์‚ฝ์ž… */
STAILQ_INSERT_HEAD(&head, n1, entries);

n1 = malloc(sizeof(struct entry));      /* ๊ผฌ๋ฆฌ์— ์‚ฝ์ž… */
STAILQ_INSERT_TAIL(&head, n1, entries);

n2 = malloc(sizeof(struct entry));      /* ๋ฐ”๋กœ ๋’ค์— ์‚ฝ์ž… */
STAILQ_INSERT_AFTER(&head, n1, n2, entries);
                                        /* ์‚ญ์ œ */
STAILQ_REMOVE(&head, n2, entry, entries);
free(n2);
                                        /* ๋จธ๋ฆฌ์—์„œ ์‚ญ์ œ */
n3 = STAILQ_FIRST(&head);
STAILQ_REMOVE_HEAD(&head, entries);
free(n3);
                                        /* ์ˆœ๋ฐฉํ–ฅ ์ˆœํšŒ */
STAILQ_FOREACH(np, &head, entries)
        np-> ...
                                        /* ๊ผฌ๋ฆฌ ํ ์‚ญ์ œ */
while (!STAILQ_EMPTY(&head)) {
        n1 = STAILQ_FIRST(&head);
        STAILQ_REMOVE_HEAD(&head, entries);
        free(n1);
}
                                        /* ๋” ๋น ๋ฅธ ๊ผฌ๋ฆฌ ํ ์‚ญ์ œ */
n1 = STAILQ_FIRST(&head);
while (n1 != NULL) {
        n2 = STAILQ_NEXT(n1, entries);
        free(n1);
        n1 = n2;
}
STAILQ_INIT(&head);

๋ฆฌ์ŠคํŠธ

๋ฆฌ์ŠคํŠธ์˜ ๋จธ๋ฆฌ๋Š” LIST_HEAD ๋งคํฌ๋กœ๋กœ ์ •์˜ํ•œ ๊ตฌ์กฐ์ฒด์ด๋‹ค. ์ด ๊ตฌ์กฐ์ฒด์—๋Š” ๋ฆฌ์ŠคํŠธ ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ ํ•˜๋‚˜๊ฐ€ ์žˆ๋‹ค. ํ•ญ๋ชฉ๋“ค์ด ์ด์ค‘์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋ฆฌ์ŠคํŠธ ์ˆœํšŒ ์—†์ด ์ž„์˜ ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ์กด ํ•ญ๋ชฉ ๋’ค๋‚˜ ๊ธฐ์กด ํ•ญ๋ชฉ ์•ž์—, ๋˜๋Š” ๋ฆฌ์ŠคํŠธ ๋จธ๋ฆฌ์— ์ƒˆ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. LIST_HEAD ๊ตฌ์กฐ์ฒด๋ฅผ ๋‹ค์Œ์ฒ˜๋Ÿผ ์„ ์–ธํ•œ๋‹ค.

LIST_HEAD(HEADNAME, TYPE) head;

HEADNAME์€ ์ •์˜ํ•˜๋ ค๋Š” ๊ตฌ์กฐ์ฒด์˜ ์ด๋ฆ„์ด๊ณ  TYPE์€ ๋ฆฌ์ŠคํŠธ๋กœ ์—ฐ๊ฒฐํ•  ํ•ญ๋ชฉ๋“ค์˜ ํƒ€์ž…์ด๋‹ค. ์ดํ›„ ๋‹ค์Œ์ฒ˜๋Ÿผ ๋ฆฌ์ŠคํŠธ ๋จธ๋ฆฌ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.

struct HEADNAME *headp;

(์ด๋ฆ„ head์™€ headp๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.)

๋งคํฌ๋กœ LIST_HEAD_INITIALIZER๋Š” ๋ฆฌ์ŠคํŠธ head๋ฅผ ์œ„ํ•œ ์ดˆ๊ธฐํ™” ๊ฐ’์œผ๋กœ ํ‰๊ฐ€๋œ๋‹ค.

๋งคํฌ๋กœ LIST_EMPTY๋Š” ๋ฆฌ์ŠคํŠธ์— ํ•ญ๋ชฉ์ด ์—†์œผ๋ฉด ์ฐธ์œผ๋กœ ํ‰๊ฐ€๋œ๋‹ค.

๋งคํฌ๋กœ LIST_ENTRY๋Š” ๋ฆฌ์ŠคํŠธ์—์„œ ํ•ญ๋ชฉ๋“ค์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ ์„ ์–ธํ•œ๋‹ค.

๋งคํฌ๋กœ LIST_FIRST๋Š” ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด ์žˆ์œผ๋ฉด NULL์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋งคํฌ๋กœ LIST_FOREACH๋Š” head๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœ๋ฐฉํ–ฅ์œผ๋กœ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ ํ•ญ๋ชฉ์„ ์ฐจ๋ก€๋กœ var์— ํ• ๋‹นํ•œ๋‹ค.

๋งคํฌ๋กœ LIST_INIT์€ head๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค.

๋งคํฌ๋กœ LIST_INSERT_HEAD๋Š” ์ƒˆ ํ•ญ๋ชฉ elm์„ ๋ฆฌ์ŠคํŠธ์˜ ๋จธ๋ฆฌ์— ์‚ฝ์ž…ํ•œ๋‹ค.

๋งคํฌ๋กœ LIST_INSERT_AFTER๋Š” ์ƒˆ ํ•ญ๋ชฉ elm์„ ํ•ญ๋ชฉ listelm ๋’ค์— ์‚ฝ์ž…ํ•œ๋‹ค.

๋งคํฌ๋กœ LIST_INSERT_BEFORE๋Š” ์ƒˆ ํ•ญ๋ชฉ elm์„ ํ•ญ๋ชฉ listelm ์•ž์— ์‚ฝ์ž…ํ•œ๋‹ค.

๋งคํฌ๋กœ LIST_NEXT๋Š” ๋ฆฌ์ŠคํŠธ ๋‚ด์˜ ๋‹ค์Œ ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ํ˜„ ํ•ญ๋ชฉ์ด ๋งˆ์ง€๋ง‰์ด๋ฉด NULL์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋งคํฌ๋กœ LIST_REMOVE๋Š” ํ•ญ๋ชฉ elm์„ ๋ฆฌ์ŠคํŠธ์—์„œ ์ œ๊ฑฐํ•œ๋‹ค.

๋ฆฌ์ŠคํŠธ ์˜ˆ์‹œ

LIST_HEAD(listhead, entry) head =
    LIST_HEAD_INITIALIZER(head);
struct listhead *headp;                 /* ๋ฆฌ์ŠคํŠธ ๋จธ๋ฆฌ */
struct entry {
        ...
        LIST_ENTRY(entry) entries;      /* ๋ฆฌ์ŠคํŠธ */
        ...
} *n1, *n2, *n3, *np, *np_temp;

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);

n3 = malloc(sizeof(struct entry));      /* ๋ฐ”๋กœ ์•ž์— ์‚ฝ์ž… */
LIST_INSERT_BEFORE(n2, n3, entries);

LIST_REMOVE(n2, entries);               /* ์‚ญ์ œ */
free(n2);
                                        /* ์ˆœ๋ฐฉํ–ฅ ์ˆœํšŒ */
LIST_FOREACH(np, &head, entries)
        np-> ...

while (!LIST_EMPTY(&head)) {            /* ๋ฆฌ์ŠคํŠธ ์‚ญ์ œ */
        n1 = LIST_FIRST(&head);
        LIST_REMOVE(n1, entries);
        free(n1);
}

n1 = LIST_FIRST(&head);                 /* ๋” ๋น ๋ฅธ ๋ฆฌ์ŠคํŠธ ์‚ญ์ œ */
while (n1 != NULL) {
        n2 = LIST_NEXT(n1, entries);
        free(n1);
        n1 = n2;
}
LIST_INIT(&head);

๊ผฌ๋ฆฌ ํ

๊ผฌ๋ฆฌ ํ์˜ ๋จธ๋ฆฌ๋Š” TAILQ_HEAD ๋งคํฌ๋กœ๋กœ ์ •์˜ํ•œ ๊ตฌ์กฐ์ฒด์ด๋‹ค. ์ด ๊ตฌ์กฐ์ฒด์—๋Š” ํฌ์ธํ„ฐ ํ•œ ์Œ์ด ์žˆ๋Š”๋ฐ, ํ•˜๋‚˜๋Š” ๊ผฌ๋ฆฌ ํ์˜ ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๊ผฌ๋ฆฌ ํ์˜ ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ํ•ญ๋ชฉ๋“ค์ด ์ด์ค‘์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๊ผฌ๋ฆฌ ํ ์ˆœํšŒ ์—†์ด ์ž„์˜ ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ์กด ํ•ญ๋ชฉ ๋’ค๋‚˜ ๊ธฐ์กด ํ•ญ๋ชฉ ์•ž์—, ๊ผฌ๋ฆฌ ํ ๋จธ๋ฆฌ๋‚˜ ๊ผฌ๋ฆฌ ํ ๋์— ์ƒˆ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. TAILQ_HEAD ๊ตฌ์กฐ์ฒด๋ฅผ ๋‹ค์Œ์ฒ˜๋Ÿผ ์„ ์–ธํ•œ๋‹ค.

TAILQ_HEAD(HEADNAME, TYPE) head;

HEADNAME์€ ์ •์˜ํ•˜๋ ค๋Š” ๊ตฌ์กฐ์ฒด์˜ ์ด๋ฆ„์ด๊ณ  TYPE์€ ๊ผฌ๋ฆฌ ํ๋กœ ์—ฐ๊ฒฐํ•  ํ•ญ๋ชฉ๋“ค์˜ ํƒ€์ž…์ด๋‹ค. ์ดํ›„ ๋‹ค์Œ์ฒ˜๋Ÿผ ๊ผฌ๋ฆฌ ํ ๋จธ๋ฆฌ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.

struct HEADNAME *headp;

(์ด๋ฆ„ head์™€ headp๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.)

๋งคํฌ๋กœ TAILQ_HEAD_INITIALIZER๋Š” ๊ผฌ๋ฆฌ ํ head๋ฅผ ์œ„ํ•œ ์ดˆ๊ธฐํ™” ๊ฐ’์œผ๋กœ ํ‰๊ฐ€๋œ๋‹ค.

๋งคํฌ๋กœ TAILQ_CONCAT์€ head2๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ผฌ๋ฆฌ ํ๋ฅผ head1์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ผฌ๋ฆฌ ํ ๋์— ์ด์–ด ๋ถ™์ด๊ณ  head2์—์„œ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•œ๋‹ค.

๋งคํฌ๋กœ TAILQ_EMPTY๋Š” ๊ผฌ๋ฆฌ ํ์— ํ•ญ๋ชฉ์ด ์—†์œผ๋ฉด ์ฐธ์œผ๋กœ ํ‰๊ฐ€๋œ๋‹ค.

๋งคํฌ๋กœ TAILQ_ENTRY๋Š” ๊ผฌ๋ฆฌ ํ์—์„œ ํ•ญ๋ชฉ๋“ค์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ ์„ ์–ธํ•œ๋‹ค.

๋งคํฌ๋กœ TAILQ_FIRST๋Š” ๊ผฌ๋ฆฌ ํ์˜ ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ๊ผฌ๋ฆฌ ํ๊ฐ€ ๋น„์–ด ์žˆ์œผ๋ฉด NULL์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋งคํฌ๋กœ TAILQ_FOREACH๋Š” head๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ผฌ๋ฆฌ ํ๋ฅผ ์ˆœ๋ฐฉํ–ฅ์œผ๋กœ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ ํ•ญ๋ชฉ์„ ์ฐจ๋ก€๋กœ var์— ํ• ๋‹นํ•œ๋‹ค. ๋ฃจํ”„๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋๋‚˜๊ฑฐ๋‚˜ ํ•ญ๋ชฉ์ด ์—†๋Š” ๊ฒฝ์šฐ์— var๋ฅผ NULL๋กœ ์„ค์ •ํ•œ๋‹ค.

๋งคํฌ๋กœ TAILQ_FOREACH_REVERSE๋Š” head๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ผฌ๋ฆฌ ํ๋ฅผ ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ ํ•ญ๋ชฉ์„ ์ฐจ๋ก€๋กœ var์— ํ• ๋‹นํ•œ๋‹ค.

๋งคํฌ๋กœ TAILQ_INIT์€ head๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ผฌ๋ฆฌ ํ๋ฅผ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค.

๋งคํฌ๋กœ TAILQ_INSERT_HEAD๋Š” ์ƒˆ ํ•ญ๋ชฉ elm์„ ๊ผฌ๋ฆฌ ํ์˜ ๋จธ๋ฆฌ์— ์‚ฝ์ž…ํ•œ๋‹ค.

๋งคํฌ๋กœ TAILQ_INSERT_TAIL์€ ์ƒˆ ํ•ญ๋ชฉ elm์„ ๊ผฌ๋ฆฌ ํ์˜ ๋์— ์‚ฝ์ž…ํ•œ๋‹ค.

๋งคํฌ๋กœ TAILQ_INSERT_AFTER๋Š” ์ƒˆ ํ•ญ๋ชฉ elm์„ ํ•ญ๋ชฉ listelm ๋’ค์— ์‚ฝ์ž…ํ•œ๋‹ค.

๋งคํฌ๋กœ TAILQ_INSERT_BEFORE๋Š” ์ƒˆ ํ•ญ๋ชฉ elm์„ ํ•ญ๋ชฉ listelm ์•ž์— ์‚ฝ์ž…ํ•œ๋‹ค.

๋งคํฌ๋กœ TAILQ_LAST๋Š” ๊ผฌ๋ฆฌ ํ์˜ ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ผฌ๋ฆฌ ํ๊ฐ€ ๋น„์–ด ์žˆ์œผ๋ฉด ๋ฐ˜ํ™˜ ๊ฐ’์ด NULL์ด๋‹ค.

๋งคํฌ๋กœ TAILQ_NEXT๋Š” ๊ผฌ๋ฆฌ ํ ๋‚ด์˜ ๋‹ค์Œ ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ํ˜„ ํ•ญ๋ชฉ์ด ๋งˆ์ง€๋ง‰์ด๋ฉด NULL์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋งคํฌ๋กœ TAILQ_PREV๋Š” ๊ผฌ๋ฆฌ ํ ๋‚ด์˜ ์ด์ „ ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ํ˜„ ํ•ญ๋ชฉ์ด ์ฒซ ๋ฒˆ์งธ์ด๋ฉด NULL์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋งคํฌ๋กœ TAILQ_REMOVE๋Š” ํ•ญ๋ชฉ elm์„ ๊ผฌ๋ฆฌ ํ์—์„œ ์ œ๊ฑฐํ•œ๋‹ค.

๋งคํฌ๋กœ TAILQ_SWAP์€ head1๊ณผ head2์˜ ๋‚ด์šฉ์„ ์„œ๋กœ ๋ฐ”๊พผ๋‹ค.

๊ผฌ๋ฆฌ ํ ์˜ˆ์‹œ

TAILQ_HEAD(tailhead, entry) head =
    TAILQ_HEAD_INITIALIZER(head);
struct tailhead *headp;                 /* ๊ผฌ๋ฆฌ ํ ๋จธ๋ฆฌ */
struct entry {
        ...
        TAILQ_ENTRY(entry) entries;     /* ๊ผฌ๋ฆฌ ํ */
        ...
} *n1, *n2, *n3, *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);

n3 = malloc(sizeof(struct entry));      /* ๋ฐ”๋กœ ์•ž์— ์‚ฝ์ž… */
TAILQ_INSERT_BEFORE(n2, n3, entries);

TAILQ_REMOVE(&head, n2, entries);       /* ์‚ญ์ œ */
free(n2);
                                        /* ์ˆœ๋ฐฉํ–ฅ ์ˆœํšŒ */
TAILQ_FOREACH(np, &head, entries)
        np-> ...
                                        /* ์—ญ๋ฐฉํ–ฅ ์ˆœํšŒ */
TAILQ_FOREACH_REVERSE(np, &head, tailhead, entries)
        np-> ...
                                        /* ๊ผฌ๋ฆฌ ํ ์‚ญ์ œ */
while (!TAILQ_EMPTY(&head)) {
        n1 = TAILQ_FIRST(&head);
        TAILQ_REMOVE(&head, n1, entries);
        free(n1);
}
                                        /* ๋” ๋น ๋ฅธ ๊ผฌ๋ฆฌ ํ ์‚ญ์ œ */
n1 = TAILQ_FIRST(&head);
while (n1 != NULL) {
        n2 = TAILQ_NEXT(n1, entries);
        free(n1);
        n1 = n2;
}
TAILQ_INIT(&head);

CONFORMING TO

POSIX.1, POSIX.1-2001, POSIX.1-2008์— ์—†์Œ. BSD์— ์žˆ์Œ. 4.4BSD์—์„œ queue ํ•จ์ˆ˜๋“ค์ด ์ฒ˜์Œ ๋“ฑ์žฅํ–ˆ๋‹ค.

SEE ALSO

insque(3)


2015๋…„ 2์›” 7์ผ

โš ๏ธ **GitHub.com Fallback** โš ๏ธ