diff options
Diffstat (limited to 'src/ll.c')
| -rw-r--r-- | src/ll.c | 97 |
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 | |||
| 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 | ||
