STAILQ(3) Library Functions Manual STAILQ(3) SIMPLEQ_EMPTY, SIMPLEQ_ENTRY, SIMPLEQ_FIRST, SIMPLEQ_FOREACH, SIMPLEQ_HEAD, SIMPLEQ_HEAD_INITIALIZER, SIMPLEQ_INIT, SIMPLEQ_INSERT_AFTER, SIMPLEQ_INSERT_HEAD, SIMPLEQ_INSERT_TAIL, SIMPLEQ_NEXT, SIMPLEQ_REMOVE, SIMPLEQ_REMOVE_HEAD, 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, STAILQ_REMOVE_HEAD, - implementation of a singly linked tail queue (libc -lc) #include STAILQ_ENTRY(TYPE); STAILQ_HEAD(HEADNAME, TYPE); STAILQ_HEAD STAILQ_HEAD_INITIALIZER(STAILQ_HEAD head); void STAILQ_INIT(STAILQ_HEAD *head); int STAILQ_EMPTY(STAILQ_HEAD *head); void STAILQ_INSERT_HEAD(STAILQ_HEAD *head, struct TYPE *elm, STAILQ_ENTRY NAME); void STAILQ_INSERT_TAIL(STAILQ_HEAD *head, struct TYPE *elm, STAILQ_ENTRY NAME); void STAILQ_INSERT_AFTER(STAILQ_HEAD *head, struct TYPE *listelm, struct TYPE *elm, STAILQ_ENTRY NAME); struct TYPE *STAILQ_FIRST(STAILQ_HEAD *head); struct TYPE *STAILQ_NEXT(struct TYPE *elm, STAILQ_ENTRY NAME); STAILQ_FOREACH(struct TYPE *var, STAILQ_HEAD *head, STAILQ_ENTRY NAME); void STAILQ_REMOVE(STAILQ_HEAD *head, struct TYPE *elm, TYPE, STAILQ_ENTRY NAME); void STAILQ_REMOVE_HEAD(STAILQ_HEAD *head, STAILQ_ENTRY NAME); void STAILQ_CONCAT(STAILQ_HEAD *head1, STAILQ_HEAD *head2); : SIMPLEQ STAILQ VERSIONS. . TYPE STAILQ_ENTRY NAME. HEADNAME STAILQ_HEAD(). STAILQ_HEAD(). . O(n) . . STAILQ_HEAD : STAILQ_HEAD(HEADNAME, TYPE) head; struct HEADNAME struct TYPE . : struct HEADNAME *headp; ( head headp .) STAILQ_ENTRY() . STAILQ_HEAD_INITIALIZER() head. STAILQ_INIT() head. STAILQ_EMPTY() . STAILQ_INSERT_HEAD() elm . STAILQ_INSERT_TAIL() elm . STAILQ_INSERT_AFTER() elm listelm. STAILQ_FIRST() NULL . STAILQ_NEXT() NULL . STAILQ_FOREACH() head var. STAILQ_REMOVE() elm . STAILQ_REMOVE_HEAD() . (macro) STAILQ_REMOVE(). STAILQ_CONCAT() head2 head1 . STAILQ_EMPTY() . STAILQ_FIRST() STAILQ_NEXT() TYPE . STAILQ_HEAD_INITIALIZER() head. BSD SIMPLEQ STAILQ. BSD . STAILQ FreeBSD SIMPLEQ NetBSD. . glibc STAILQ SIMPLEQ SIMPLEQ STAILQ_CONCAT(). STAILQ_FOREACH() var . STAILQ_FOREACH_SAFE() BSD glibc var . BSD. 4.4BSD. #include #include #include #include struct entry { int data; STAILQ_ENTRY(entry) entries; /* Singly linked tail queue */ }; STAILQ_HEAD(stailhead, entry); int main(void) { struct entry *n1, *n2, *n3, *np; struct stailhead head; /* Singly linked tail queue head */ STAILQ_INIT(&head); /* Initialize the queue */ n1 = malloc(sizeof(struct entry)); /* Insert at the head */ STAILQ_INSERT_HEAD(&head, n1, entries); n1 = malloc(sizeof(struct entry)); /* Insert at the tail */ STAILQ_INSERT_TAIL(&head, n1, entries); n2 = malloc(sizeof(struct entry)); /* Insert after */ STAILQ_INSERT_AFTER(&head, n1, n2, entries); STAILQ_REMOVE(&head, n2, entry, entries); /* Deletion */ free(n2); n3 = STAILQ_FIRST(&head); STAILQ_REMOVE_HEAD(&head, entries); /* Deletion from the head */ free(n3); n1 = STAILQ_FIRST(&head); n1->data = 0; for (unsigned int i = 1; i < 5; i++) { n1 = malloc(sizeof(struct entry)); STAILQ_INSERT_HEAD(&head, n1, entries); n1->data = i; } /* Forward traversal */ STAILQ_FOREACH(np, &head, entries) printf("%i\n", np->data); /* TailQ deletion */ n1 = STAILQ_FIRST(&head); while (n1 != NULL) { n2 = STAILQ_NEXT(n1, entries); free(n1); n1 = n2; } STAILQ_INIT(&head); exit(EXIT_SUCCESS); } insque(3) queue(7) 3 . . : . 6.18 21 2025 STAILQ(3)