#include #include #include "dlist.h" int dlist_get(const struct dlist *list, size_t index) { if (index >= list->size) return -1; struct dlist_item *i; for (i = list->head; index; index--, i = i->next) { continue; } return i->data; } int dlist_insert_at(struct dlist *list, int element, size_t index) { if (index > list->size || element < 0) return 0; else if (index == list->size) dlist_push_back(list, element); else if (index == 0) dlist_push_front(list, element); else { struct dlist_item *new = malloc(sizeof(struct dlist_item)); if (new == NULL) return 0; new->data = element; struct dlist_item *i; for (i = list->head; index - 1; index--, i = i->next) continue; new->next = i->next; i->next->prev = new; i->next = new; new->prev = i; list->size++; } return 1; } int dlist_find(const struct dlist *list, int element) { int index = 0; struct dlist_item *i; for (i = list->head; i && i->data != element; index++, i = i->next) continue; if (!i) return -1; return index; } int dlist_remove_at(struct dlist *list, size_t index) { if (index >= list->size) return -1; int res; struct dlist_item *item; if (list->size == 1) { item = list->head; res = list->head->data; list->head = NULL; list->tail = NULL; } else if (index == 0) { item = list->head; res = item->data; item->next->prev = NULL; list->head = item->next; } else if (index == list->size - 1) { item = list->tail; res = item->data; item->prev->next = NULL; list->tail = item->prev; } else { for (item = list->head; index; index--, item = item->next) continue; res = item->data; item->prev->next = item->next; item->next->prev = item->prev; } free(item); list->size--; return res; } void dlist_clear(struct dlist *list) { if (list->size == 0) return; for (struct dlist_item *i = list->head; i;) { struct dlist_item *tmp = i->next; free(i); i = tmp; } list->size = 0; list->head = NULL; list->tail = NULL; }