#include "LinkedList.h" #include LinkedList *linkedlist_new(void) { LinkedList *ll = malloc(sizeof(LinkedList)); if (!ll) return NULL; ll->head = NULL; ll->tail = NULL; ll->size = 0; return ll; } void linkedlist_delete(LinkedList *ll) { LinkedListNode *node = ll->head; LinkedListNode *next; while (node) { next = node->next; free(node); node = next; } free(ll); } LinkedListNode *linkedlist_append(LinkedList *ll, void *elem) { LinkedListNode *new_node = malloc(sizeof(LinkedListNode)); if (!new_node) return NULL; new_node->data = elem; new_node->next = NULL; if (!ll->head) { new_node->prev = NULL; ll->head = new_node; ll->tail = new_node; } else { ll->tail->next = new_node; new_node->prev = ll->tail; ll->tail = new_node; } ll->size++; return new_node; } void *linkedlist_popfront(LinkedList *ll) { if (!ll->head) return NULL; void *elem = ll->head->data; LinkedListNode *node = ll->head; ll->head = ll->head->next; ll->size--; free(node); return elem; } LinkedListNode *linkedlist_find(LinkedList *ll, void *elem) { if (!ll->head) return NULL; LinkedListNode *node = ll->head; while (node) { /* !NOTE should use a given comparator function * instead of '==' operator */ if (node->data == elem) return node; node = node->next; } return NULL; // Couldn't find the element } void *linkedlist_remove(LinkedList *ll, LinkedListNode *node) { void *elem = node->data; if (node->prev) node->prev->next = node->next; else ll->head = node->next; if (node->next) node->next->prev = node->prev; else ll->tail = node->prev; free(node); ll->size--; return elem; }