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 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/ll.h | 35 +++++++++++++++++++++++ 2 files changed, 132 insertions(+) create mode 100644 src/ll.c create mode 100644 src/ll.h (limited to 'src') 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 diff --git a/src/ll.h b/src/ll.h new file mode 100644 index 0000000..5e47bd9 --- /dev/null +++ b/src/ll.h @@ -0,0 +1,35 @@ +#ifndef __VXGG_REWRITE___SHARED_H___28542989122405___ +#define __VXGG_REWRITE___SHARED_H___28542989122405___ + +#include + +typedef struct dll { + void *data; + int (*dfreecb)(void*); + + struct dll *next; + struct dll *prev; +} dllnode; + +typedef struct { + dllnode *start; + dllnode *end; + size_t size; +} dlinkedlist; + +// Initialize a dlinkedlist +void dlinkedlist_init(dlinkedlist **ll); + +// Free a dlinkedlist and its elements +void dlinkedlist_free(dlinkedlist **ll); + +// Insert an element to the beginning of the list +int dlinkedlist_insert(dlinkedlist * const ll, void *data, int (*dfreecb)(void*)); + +// Insert an element to the end of the list +int dlinkedlist_append(dlinkedlist * const ll, void *data, int (*dfreecb)(void*)); + +// Get the element from a dlinkedlist at index +dllnode *dlinkedlist_get(const dlinkedlist * const ll, size_t index); + +#endif \ No newline at end of file -- cgit v1.2.3