diff options
| author | @syxhe <https://t.me/syxhe> | 2025-02-12 16:47:43 -0600 |
|---|---|---|
| committer | @syxhe <https://t.me/syxhe> | 2025-02-12 16:47:43 -0600 |
| commit | c1b188af8c51e29c96a0422b79516d95696869e7 (patch) | |
| tree | c6e1958727a6acc59e9c4c88240e121c274f5f28 /src | |
| parent | 7aab85b35f884344585101aedfbd3a922bdeeb19 (diff) | |
Implement a linked list struct
Diffstat (limited to 'src')
| -rw-r--r-- | src/ll.c | 97 | ||||
| -rw-r--r-- | src/ll.h | 35 |
2 files changed, 132 insertions, 0 deletions
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 @@ | |||
| 1 | #include "ll.h" | ||
| 2 | |||
| 3 | #include <stddef.h> | ||
| 4 | |||
| 5 | void dlinkedlist_init(dlinkedlist **ll) { | ||
| 6 | (*ll) = xcalloc(1, sizeof(**ll)); | ||
| 7 | |||
| 8 | (*ll)->start = NULL; | ||
| 9 | (*ll)->end = NULL; | ||
| 10 | (*ll)->size = 0; | ||
| 11 | |||
| 12 | return; | ||
| 13 | } | ||
| 14 | |||
| 15 | void dlinkedlist_free(dlinkedlist **ll) { | ||
| 16 | dllnode *p = (*ll)->start, *n; | ||
| 17 | while(p != NULL) { | ||
| 18 | n = p->next; | ||
| 19 | |||
| 20 | if(p->dfreecb != NULL) | ||
| 21 | p->dfreecb(p->data); | ||
| 22 | free(p); | ||
| 23 | |||
| 24 | p = n; | ||
| 25 | } | ||
| 26 | |||
| 27 | free(*ll); | ||
| 28 | (*ll) = NULL; | ||
| 29 | return; | ||
| 30 | } | ||
| 31 | |||
| 32 | int dlinkedlist_firstitem(dlinkedlist * const ll, void *data, int (*dfreecb)(void*)) { | ||
| 33 | if(!ll) | ||
| 34 | return -1; | ||
| 35 | if(ll->size != 0) | ||
| 36 | return 0; | ||
| 37 | |||
| 38 | dllnode *n = xcalloc(1, sizeof(*n)); | ||
| 39 | n->next = NULL; | ||
| 40 | n->prev = NULL; | ||
| 41 | n->data = data; | ||
| 42 | n->dfreecb = dfreecb; | ||
| 43 | |||
| 44 | ll->start = n; | ||
| 45 | ll->end = n; | ||
| 46 | ll->size = 1; | ||
| 47 | |||
| 48 | return 1; | ||
| 49 | } | ||
| 50 | |||
| 51 | int dlinkedlist_insert(dlinkedlist * const ll, void *data, int (*dfreecb)(void*)) { | ||
| 52 | if(!ll) | ||
| 53 | return -1; | ||
| 54 | if(dlinkedlist_firstitem(ll, data, dfreecb) > 0) | ||
| 55 | return 0; | ||
| 56 | |||
| 57 | dllnode *n = xcalloc(1, sizeof(*n)); | ||
| 58 | n->data = data; | ||
| 59 | n->dfreecb = dfreecb; | ||
| 60 | n->prev = NULL; | ||
| 61 | n->next = ll->start; | ||
| 62 | |||
| 63 | ll->start->prev = n; | ||
| 64 | ll->start = n; | ||
| 65 | ll->size++; | ||
| 66 | |||
| 67 | return 0; | ||
| 68 | } | ||
| 69 | |||
| 70 | int dlinkedlist_append(dlinkedlist * const ll, void *data, int (*dfreecb)(void*)) { | ||
| 71 | if(!ll) | ||
| 72 | return -1; | ||
| 73 | if(dlinkedlist_firstitem(ll, data, dfreecb) > 0) | ||
| 74 | return 0; | ||
| 75 | |||
| 76 | dllnode *n = xcalloc(1, sizeof(*n)); | ||
| 77 | n->data = data; | ||
| 78 | n->dfreecb = dfreecb; | ||
| 79 | n->prev = ll->end; | ||
| 80 | n->next = NULL; | ||
| 81 | |||
| 82 | ll->end->next = n; | ||
| 83 | ll->end = n; | ||
| 84 | ll->size++; | ||
| 85 | |||
| 86 | return 0; | ||
| 87 | } | ||
| 88 | |||
| 89 | dllnode *dlinkedlist_get(const dlinkedlist * const ll, size_t index) { | ||
| 90 | if(index >= ll->size) | ||
| 91 | return NULL; | ||
| 92 | |||
| 93 | dllnode *p = ll->start; | ||
| 94 | for(size_t i = 0; i < index && p != NULL; i++, p = p->next); | ||
| 95 | |||
| 96 | return p; | ||
| 97 | } \ 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 @@ | |||
| 1 | #ifndef __VXGG_REWRITE___SHARED_H___28542989122405___ | ||
| 2 | #define __VXGG_REWRITE___SHARED_H___28542989122405___ | ||
| 3 | |||
| 4 | #include <stddef.h> | ||
| 5 | |||
| 6 | typedef struct dll { | ||
| 7 | void *data; | ||
| 8 | int (*dfreecb)(void*); | ||
| 9 | |||
| 10 | struct dll *next; | ||
| 11 | struct dll *prev; | ||
| 12 | } dllnode; | ||
| 13 | |||
| 14 | typedef struct { | ||
| 15 | dllnode *start; | ||
| 16 | dllnode *end; | ||
| 17 | size_t size; | ||
| 18 | } dlinkedlist; | ||
| 19 | |||
| 20 | // Initialize a dlinkedlist | ||
| 21 | void dlinkedlist_init(dlinkedlist **ll); | ||
| 22 | |||
| 23 | // Free a dlinkedlist and its elements | ||
| 24 | void dlinkedlist_free(dlinkedlist **ll); | ||
| 25 | |||
| 26 | // Insert an element to the beginning of the list | ||
| 27 | int dlinkedlist_insert(dlinkedlist * const ll, void *data, int (*dfreecb)(void*)); | ||
| 28 | |||
| 29 | // Insert an element to the end of the list | ||
| 30 | int dlinkedlist_append(dlinkedlist * const ll, void *data, int (*dfreecb)(void*)); | ||
| 31 | |||
| 32 | // Get the element from a dlinkedlist at index | ||
| 33 | dllnode *dlinkedlist_get(const dlinkedlist * const ll, size_t index); | ||
| 34 | |||
| 35 | #endif \ No newline at end of file | ||
