summaryrefslogtreecommitdiff
path: root/graphs/piscine/dlist/dlist-2.c
diff options
context:
space:
mode:
Diffstat (limited to 'graphs/piscine/dlist/dlist-2.c')
-rw-r--r--graphs/piscine/dlist/dlist-2.c113
1 files changed, 113 insertions, 0 deletions
diff --git a/graphs/piscine/dlist/dlist-2.c b/graphs/piscine/dlist/dlist-2.c
new file mode 100644
index 0000000..5ccdaa3
--- /dev/null
+++ b/graphs/piscine/dlist/dlist-2.c
@@ -0,0 +1,113 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#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;
+}