From c9b6b9a5ca082fe7c1b6f58d7713f785a9eb6a5c Mon Sep 17 00:00:00 2001 From: Martial Simon Date: Mon, 15 Sep 2025 01:08:27 +0200 Subject: add: graphs et rushs --- rushs/tinyprintf/dlist/dlist-2.c | 113 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 rushs/tinyprintf/dlist/dlist-2.c (limited to 'rushs/tinyprintf/dlist/dlist-2.c') diff --git a/rushs/tinyprintf/dlist/dlist-2.c b/rushs/tinyprintf/dlist/dlist-2.c new file mode 100644 index 0000000..5ccdaa3 --- /dev/null +++ b/rushs/tinyprintf/dlist/dlist-2.c @@ -0,0 +1,113 @@ +#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; +} -- cgit v1.2.3