#include #include "list.h" typedef struct lnode { void *data; struct lnode *next; } ListNode; void list_initialize(List *l) { l->head = NULL; l->tail = NULL; } void list_append(List *l, void *data) { ListNode *new_node = (ListNode *) malloc(sizeof(ListNode)); new_node->data = data; new_node->next = NULL; if (l->head == NULL) l->head = l->tail = new_node; else { l->tail->next = new_node; l->tail = new_node; } } void list_prepend(List *l, void *data) { ListNode *new_node = (ListNode *) malloc(sizeof(ListNode)); new_node->data = data; new_node->next = l->head; if (l->head == NULL) l->head = l->tail = new_node; else l->head = new_node; } int list_is_empty(List *l) { return (l->head == NULL); } void list_get_cursor(List *l, ListCursor *c) { *c = l->head; } int cursor_at_end(ListCursor c) { return (c == NULL); } void * cursor_advance(ListCursor *c) { *c = (*c)->next; if (*c) return (*c)->data; else return NULL; } void * cursor_data(ListCursor c) { if (c) return c->data; else return NULL; } void list_destroy(List *l) { ListNode *next, *ptr; ptr = l->head; while (ptr != NULL) { next = ptr->next; free(ptr); ptr = next; } l->head = l->tail = NULL; } void list_do(List *l, void (*action)(void *, void *), void *user_data) { ListNode *ptr, *next; ptr = l->head; while (ptr != NULL) { next = ptr->next; action(ptr->data, user_data); ptr = next; } }