(3) Library Functions Manual (3) 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 - (libc -lc) #include LIST_ENTRY(TYPE); LIST_HEAD(HEADNAME, TYPE); LIST_HEAD LIST_HEAD_INITIALIZER(LIST_HEAD head); void LIST_INIT(LIST_HEAD *head); int LIST_EMPTY(LIST_HEAD *head); void LIST_INSERT_HEAD(LIST_HEAD *head, struct TYPE *elm, LIST_ENTRY NAME); void LIST_INSERT_BEFORE(struct TYPE *listelm, struct TYPE *elm, LIST_ENTRY NAME); void LIST_INSERT_AFTER(struct TYPE *listelm, struct TYPE *elm, LIST_ENTRY NAME); struct TYPE *LIST_FIRST(LIST_HEAD *head); struct TYPE *LIST_NEXT(struct TYPE *elm, LIST_ENTRY NAME); LIST_FOREACH(struct TYPE *var, LIST_HEAD *head, LIST_ENTRY NAME); void LIST_REMOVE(struct TYPE *elm, LIST_ENTRY NAME); . TYPE LIST_ENTRY NAME. HEADNAME LIST_HEAD(). LIST_HEAD(). . . . LIST_HEAD : LIST_HEAD(HEADNAME, TYPE) head; struct HEADNAME struct TYPE . : struct HEADNAME *headp; ( head headp .) LIST_ENTRY() . LIST_HEAD_INITIALIZER() head. LIST_INIT() head. LIST_EMPTY() . LIST_INSERT_HEAD() elm . LIST_INSERT_BEFORE() elm listelm. LIST_INSERT_AFTER() elm listelm. LIST_FIRST() NULL . LIST_NEXT() NULL . LIST_FOREACH() head var. LIST_REMOVE() elm . LIST_EMPTY() . LIST_FIRST() LIST_NEXT() TYPE . LIST_HEAD_INITIALIZER() head. BSD. 4.4BSD. LIST_FOREACH() var . LIST_FOREACH_SAFE() BSD glibc var . #include #include #include #include struct entry { int data; LIST_ENTRY(entry) entries; /* List */ }; LIST_HEAD(listhead, entry); int main(void) { struct entry *n1, *n2, *n3, *np; struct listhead head; /* List head */ int i; LIST_INIT(&head); /* Initialize the list */ n1 = malloc(sizeof(struct entry)); /* Insert at the head */ LIST_INSERT_HEAD(&head, n1, entries); n2 = malloc(sizeof(struct entry)); /* Insert after */ LIST_INSERT_AFTER(n1, n2, entries); n3 = malloc(sizeof(struct entry)); /* Insert before */ LIST_INSERT_BEFORE(n2, n3, entries); i = 0; /* Forward traversal */ LIST_FOREACH(np, &head, entries) np->data = i++; LIST_REMOVE(n2, entries); /* Deletion */ free(n2); /* Forward traversal */ LIST_FOREACH(np, &head, entries) printf("%i\n", np->data); /* List deletion */ n1 = LIST_FIRST(&head); while (n1 != NULL) { n2 = LIST_NEXT(n1, entries); free(n1); n1 = n2; } LIST_INIT(&head); exit(EXIT_SUCCESS); } insque(3) queue(7) 3 . . : . 6.18 17 2025 (3)