summaryrefslogtreecommitdiff
path: root/src/ll.c
diff options
context:
space:
mode:
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
commitc1b188af8c51e29c96a0422b79516d95696869e7 (patch)
treec6e1958727a6acc59e9c4c88240e121c274f5f28 /src/ll.c
parent7aab85b35f884344585101aedfbd3a922bdeeb19 (diff)
Implement a linked list struct
Diffstat (limited to 'src/ll.c')
-rw-r--r--src/ll.c97
1 files changed, 97 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
5void 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
15void 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
32int 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
51int 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
70int 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
89dllnode *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