#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; }