CIRCLEQ(3) Library Functions Manual CIRCLEQ(3) CIRCLEQ_EMPTY CIRCLEQ_ENTRY CIRCLEQ_FIRST CIRCLEQ_FOREACH CIRCLEQ_FOREACH_REVERSE CIRCLEQ_HEAD CIRCLEQ_HEAD_INITIALIZER CIRCLEQ_INIT CIRCLEQ_INSERT_AFTER CIRCLEQ_INSERT_BEFORE CIRCLEQ_INSERT_HEAD CIRCLEQ_INSERT_TAIL CIRCLEQ_LAST CIRCLEQ_LOOP_NEXT CIRCLEQ_LOOP_PREV CIRCLEQ_NEXT CIRCLEQ_PREV CIRCLEQ_REMOVE - (libc -lc) #include CIRCLEQ_ENTRY(TYPE); CIRCLEQ_HEAD(HEADNAME, TYPE); CIRCLEQ_HEAD CIRCLEQ_HEAD_INITIALIZER(CIRCLEQ_HEAD head); void CIRCLEQ_INIT(CIRCLEQ_HEAD *head); int CIRCLEQ_EMPTY(CIRCLEQ_HEAD *head); void CIRCLEQ_INSERT_HEAD(CIRCLEQ_HEAD *head, struct TYPE *elm, CIRCLEQ_ENTRY NAME); void CIRCLEQ_INSERT_TAIL(CIRCLEQ_HEAD *head, struct TYPE *elm, CIRCLEQ_ENTRY NAME); void CIRCLEQ_INSERT_BEFORE(CIRCLEQ_HEAD *head, struct TYPE *listelm, struct TYPE *elm, CIRCLEQ_ENTRY NAME); void CIRCLEQ_INSERT_AFTER(CIRCLEQ_HEAD *head, struct TYPE *listelm, struct TYPE *elm, CIRCLEQ_ENTRY NAME); struct TYPE *CIRCLEQ_FIRST(CIRCLEQ_HEAD *head); struct TYPE *CIRCLEQ_LAST(CIRCLEQ_HEAD *head); struct TYPE *CIRCLEQ_PREV(struct TYPE *elm, CIRCLEQ_ENTRY NAME); struct TYPE *CIRCLEQ_NEXT(struct TYPE *elm, CIRCLEQ_ENTRY NAME); struct TYPE *CIRCLEQ_LOOP_PREV(CIRCLEQ_HEAD *head, struct TYPE *elm, CIRCLEQ_ENTRY NAME); struct TYPE *CIRCLEQ_LOOP_NEXT(CIRCLEQ_HEAD *head, struct TYPE *elm, CIRCLEQ_ENTRY NAME); CIRCLEQ_FOREACH(struct TYPE *var, CIRCLEQ_HEAD *head, CIRCLEQ_ENTRY NAME); CIRCLEQ_FOREACH_REVERSE(struct TYPE *var, CIRCLEQ_HEAD *head, CIRCLEQ_ENTRY NAME); void CIRCLEQ_REMOVE(CIRCLEQ_HEAD *head, struct TYPE *elm, CIRCLEQ_ENTRY NAME); . TYPE CIRCLEQ_ENTRY NAME. HEADNAME CIRCLEQ_HEAD(). CIRCLEQ_HEAD(). . . . CIRCLEQ_HEAD : CIRCLEQ_HEAD(HEADNAME, TYPE) head; struct HEADNAME struct TYPE . : struct HEADNAME *headp; ( head headp .) CIRCLEQ_ENTRY() . CIRCLEQ_HEAD_INITIALIZER() head. CIRCLEQ_INIT() head. CIRCLEQ_EMPTY() . CIRCLEQ_INSERT_HEAD() elm . CIRCLEQ_INSERT_TAIL() elm . CIRCLEQ_INSERT_BEFORE() elm listelm. CIRCLEQ_INSERT_AFTER() elm listelm. CIRCLEQ_FIRST() . CIRCLEQ_LAST() . CIRCLEQ_PREV() &head . CIRCLEQ_NEXT() &head . CIRCLEQ_LOOP_PREV() . elm . CIRCLEQ_LOOP_NEXT() . elm . CIRCLEQ_FOREACH() head var. var &head . CIRCLEQ_FOREACH_REVERSE() head var. CIRCLEQ_REMOVE() elm . CIRCLEQ_EMPTY() . CIRCLEQ_FIRST() CIRCLEQ_LAST() CIRCLEQ_LOOP_PREV() CIRCLEQ_LOOP_NEXT() TYPE . CIRCLEQ_PREV() CIRCLEQ_NEXT() CIRCLEQ_LOOP_*() &head. CIRCLEQ_HEAD_INITIALIZER() head. BSD. CIRCLEQ_FOREACH() CIRCLEQ_FOREACH_REVERSE() var . CIRCLEQ_FOREACH_SAFE() CIRCLEQ_FOREACH_REVERSE_SAFE() BSD glibc var . #include #include #include #include struct entry { int data; CIRCLEQ_ENTRY(entry) entries; /* Queue */ }; CIRCLEQ_HEAD(circlehead, entry); int main(void) { struct entry *n1, *n2, *n3, *np; struct circlehead head; /* Queue head */ int i; CIRCLEQ_INIT(&head); /* Initialize the queue */ n1 = malloc(sizeof(struct entry)); /* Insert at the head */ CIRCLEQ_INSERT_HEAD(&head, n1, entries); n1 = malloc(sizeof(struct entry)); /* Insert at the tail */ CIRCLEQ_INSERT_TAIL(&head, n1, entries); n2 = malloc(sizeof(struct entry)); /* Insert after */ CIRCLEQ_INSERT_AFTER(&head, n1, n2, entries); n3 = malloc(sizeof(struct entry)); /* Insert before */ CIRCLEQ_INSERT_BEFORE(&head, n2, n3, entries); CIRCLEQ_REMOVE(&head, n2, entries); /* Deletion */ free(n2); /* Forward traversal */ i = 0; CIRCLEQ_FOREACH(np, &head, entries) np->data = i++; /* Reverse traversal */ CIRCLEQ_FOREACH_REVERSE(np, &head, entries) printf("%i\n", np->data); /* Queue deletion */ n1 = CIRCLEQ_FIRST(&head); while (n1 != (void *)&head) { n2 = CIRCLEQ_NEXT(n1, entries); free(n1); n1 = n2; } CIRCLEQ_INIT(&head); exit(EXIT_SUCCESS); } insque(3) queue(7) 3 . . : . 6.18 17 2025 CIRCLEQ(3)