queue(3) - wariua/manpages-ko GitHub Wiki
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 - ๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ, ๋จ์ผ ์ฐ๊ฒฐ ๊ผฌ๋ฆฌ ํ, ๋ฆฌ์คํธ, ๊ผฌ๋ฆฌ ํ ๊ตฌํ
#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);
์ด ๋งคํฌ๋ก๋ค์ ๋ค ๊ฐ์ง ์๋ฃ ๊ตฌ์กฐ(๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ, ๋จ์ผ ์ฐ๊ฒฐ ๊ผฌ๋ฆฌ ํ, ๋ฆฌ์คํธ, ๊ผฌ๋ฆฌ ํ)์ ๋ํด ์ ์๋์ด ๋์ํ๋ค. ๋ค ๊ฐ์ง ๊ตฌ์กฐ ๋ชจ๋ ๋ค์ ๊ธฐ๋ฅ์ฑ์ ์ง์ํ๋ค.
- ๋ฆฌ์คํธ ๋จธ๋ฆฌ์ ์ ํญ๋ชฉ ์ฝ์ ํ๊ธฐ.
- ๋ฆฌ์คํธ ๋ด ์์ ํญ๋ชฉ ๋ค์ ์ ํญ๋ชฉ ์ฝ์ ํ๊ธฐ.
- ๋ฆฌ์คํธ ๋จธ๋ฆฌ์์ O(1)์ผ๋ก ํญ๋ชฉ ์ ๊ฑฐํ๊ธฐ.
- ์๋ฐฉํฅ์ผ๋ก ๋ฆฌ์คํธ ์ํํ๊ธฐ.
- ๋ ๋ฆฌ์คํธ์ ๋ด์ฉ ์๋ก ๋ฐ๊พธ๊ธฐ.
๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ๋ค ๊ฐ์ง ์๋ฃ ๊ตฌ์กฐ ์ค ๊ฐ์ฅ ๋จ์ํ๋ฉฐ ์ ๊ธฐ๋ฅ๋ค๋ง ์ง์ํ๋ค. ๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ๋ฐ์ดํฐ ์์ด ๋ง๊ณ ์ ๊ฑฐ๊ฐ ์๋ ์์ฉ์, ๋๋ LIFO ํ ๊ตฌํ์ ์ ๋ง๋๋ค. ๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์๋ ์ถ๊ฐ๋ก ๋ค์ ๊ธฐ๋ฅ์ฑ์ด ์๋ค.
- ๋ฆฌ์คํธ ๋ด ์์ ํญ๋ชฉ์ O(n)์ผ๋ก ์ ๊ฑฐํ๊ธฐ.
๋จ์ผ ์ฐ๊ฒฐ ๊ผฌ๋ฆฌ ํ์๋ ์ถ๊ฐ๋ก ๋ค์ ๊ธฐ๋ฅ์ฑ์ด ์๋ค.
- ๋ฆฌ์คํธ ๋์ ํญ๋ชฉ์ ์ถ๊ฐํ ์ ์๋ค.
- ๋ฆฌ์คํธ ๋ด ์์ ํญ๋ชฉ์ O(n)์ผ๋ก ์ ๊ฑฐํ๊ธฐ.
- ๋ ๋ฆฌ์คํธ๋ฅผ ์ด์ด ๋ถ์ผ ์ ์๋ค.
ํ์ง๋ง
- ๋ฆฌ์คํธ ์ฝ์ ์ ๋ฆฌ์คํธ ๋จธ๋ฆฌ๋ฅผ ์ง์ ํด์ผ ํ๋ค.
- ๊ฐ ๋จธ๋ฆฌ ํญ๋ชฉ์ ํฌ์ธํฐ๊ฐ ํ ๊ฐ๊ฐ ์๋๋ผ ๋ ๊ฐ ํ์ํ๋ค.
- ๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋น๊ตํ ๋ ์ฝ๋ ํฌ๊ธฐ๊ฐ 15% ์ ๋ ํฌ๊ณ ๋์์ด 20% ์ ๋ ๋๋ฆฌ๋ค.
๋จ์ผ ์ฐ๊ฒฐ ๊ผฌ๋ฆฌ ํ๋ ๋ฐ์ดํฐ ์์ด ๋ง๊ณ ์ญ์ ๊ฐ ๋๋ฌผ๊ฑฐ๋ ์๋ ์์ฉ์, ๋๋ FIFO ํ ๊ตฌํ์ ์ ๋ง๋๋ค.
์ด์ค ์ฐ๊ฒฐ ๋ฐฉ์ ์๋ฃ ๊ตฌ์กฐ ๋ชจ๋(๋ฆฌ์คํธ์ ๊ผฌ๋ฆฌ ํ)์์๋ ์ถ๊ฐ๋ก ๋ค์์ด ๊ฐ๋ฅํ๋ค.
- ๋ฆฌ์คํธ ๋ด ์์ ํญ๋ชฉ ์์ ์ ํญ๋ชฉ ์ฝ์ ํ๊ธฐ.
- ๋ฆฌ์คํธ ๋ด ์์ ํญ๋ชฉ์ O(1)์ผ๋ก ์ ๊ฑฐํ๊ธฐ.
ํ์ง๋ง
- ๊ฐ ํญ๋ชฉ์ ํฌ์ธํฐ๊ฐ ํ ๊ฐ๊ฐ ์๋๋ผ ๋ ๊ฐ ํ์ํ๋ค.
- ์ฝ๋ ํฌ๊ธฐ์ (์ ๊ฑฐ๋ฅผ ์ ์ธํ) ์คํ ์๊ฐ์ด ๋จ์ผ ์ฐ๊ฒฐ ์๋ฃ ๊ตฌ์กฐ์ ๋ ๋ฐฐ ์ ๋์ด๋ค.
์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ๊ฐ์ฅ ๋จ์ํ ์ด์ค ์ฐ๊ฒฐ ์๋ฃ ๊ตฌ์กฐ์ด๋ค. ์์๋ค ์ถ๊ฐ๋ก ๋ค์ ๊ธฐ๋ฅ์ฑ์ด ์๋ค.
- ์ญ๋ฐฉํฅ์ผ๋ก ์ํํ ์ ์๋ค.
ํ์ง๋ง
- ์ญ๋ฐฉํฅ์ผ๋ก ์ํํ๋ ค๋ฉด ์ํ๋ฅผ ์์ํ ํญ๋ชฉ๊ณผ ๊ทธ ํญ๋ชฉ์ ๋ด์ ๋ฆฌ์คํธ๋ฅผ ์ง์ ํด์ผ ํ๋ค.
๊ผฌ๋ฆฌ ํ์๋ ์ถ๊ฐ๋ก ๋ค์ ๊ธฐ๋ฅ์ฑ์ด ์๋ค.
- ๋ฆฌ์คํธ ๋์ ํญ๋ชฉ์ ์ถ๊ฐํ ์ ์๋ค.
- ๊ผฌ๋ฆฌ์์ ๋จธ๋ฆฌ๋ก ์ญ๋ฐฉํฅ ์ํ๋ฅผ ํ ์ ์๋ค.
- ๋ ๋ฆฌ์คํธ๋ฅผ ์ด์ด ๋ถ์ผ ์ ์๋ค.
ํ์ง๋ง
- ๋ฆฌ์คํธ ์ฝ์ ๋ฐ ์ ๊ฑฐ ์ ๋ฆฌ์คํธ ๋จธ๋ฆฌ๋ฅผ ์ง์ ํด์ผ ํ๋ค.
- ๊ฐ ๋จธ๋ฆฌ ํญ๋ชฉ์ ํฌ์ธํฐ๊ฐ ํ ๊ฐ๊ฐ ์๋๋ผ ๋ ๊ฐ ํ์ํ๋ค.
- ๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋น๊ตํ ๋ ์ฝ๋ ํฌ๊ธฐ๊ฐ 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);
POSIX.1, POSIX.1-2001, POSIX.1-2008์ ์์. BSD์ ์์. 4.4BSD์์ queue
ํจ์๋ค์ด ์ฒ์ ๋ฑ์ฅํ๋ค.
2015๋ 2์ 7์ผ