From c1b188af8c51e29c96a0422b79516d95696869e7 Mon Sep 17 00:00:00 2001 From: "@syxhe" Date: Wed, 12 Feb 2025 16:47:43 -0600 Subject: Implement a linked list struct --- src/ll.c | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 src/ll.c (limited to 'src/ll.c') diff --git a/src/ll.c b/src/ll.c new file mode 100644 index 0000000..c94a45b --- /dev/null +++ b/src/ll.c @@ -0,0 +1,97 @@ +#include "ll.h" + +#include + +void dlinkedlist_init(dlinkedlist **ll) { + (*ll) = xcalloc(1, sizeof(**ll)); + + (*ll)->start = NULL; + (*ll)->end = NULL; + (*ll)->size = 0; + + return; +} + +void dlinkedlist_free(dlinkedlist **ll) { + dllnode *p = (*ll)->start, *n; + while(p != NULL) { + n = p->next; + + if(p->dfreecb != NULL) + p->dfreecb(p->data); + free(p); + + p = n; + } + + free(*ll); + (*ll) = NULL; + return; +} + +int dlinkedlist_firstitem(dlinkedlist * const ll, void *data, int (*dfreecb)(void*)) { + if(!ll) + return -1; + if(ll->size != 0) + return 0; + + dllnode *n = xcalloc(1, sizeof(*n)); + n->next = NULL; + n->prev = NULL; + n->data = data; + n->dfreecb = dfreecb; + + ll->start = n; + ll->end = n; + ll->size = 1; + + return 1; +} + +int dlinkedlist_insert(dlinkedlist * const ll, void *data, int (*dfreecb)(void*)) { + if(!ll) + return -1; + if(dlinkedlist_firstitem(ll, data, dfreecb) > 0) + return 0; + + dllnode *n = xcalloc(1, sizeof(*n)); + n->data = data; + n->dfreecb = dfreecb; + n->prev = NULL; + n->next = ll->start; + + ll->start->prev = n; + ll->start = n; + ll->size++; + + return 0; +} + +int dlinkedlist_append(dlinkedlist * const ll, void *data, int (*dfreecb)(void*)) { + if(!ll) + return -1; + if(dlinkedlist_firstitem(ll, data, dfreecb) > 0) + return 0; + + dllnode *n = xcalloc(1, sizeof(*n)); + n->data = data; + n->dfreecb = dfreecb; + n->prev = ll->end; + n->next = NULL; + + ll->end->next = n; + ll->end = n; + ll->size++; + + return 0; +} + +dllnode *dlinkedlist_get(const dlinkedlist * const ll, size_t index) { + if(index >= ll->size) + return NULL; + + dllnode *p = ll->start; + for(size_t i = 0; i < index && p != NULL; i++, p = p->next); + + return p; +} \ No newline at end of file -- cgit v1.2.3