From 30296829f05c3cab2090c7045e2dfb8286ebbac0 Mon Sep 17 00:00:00 2001 From: Denys Sanchuk Date: Mon, 14 Apr 2025 21:07:23 +0000 Subject: [PATCH] Aktualizovat du6/list_ops.c --- du6/list_ops.c | 89 ++++++++++++++++++++------------------------------ 1 file changed, 35 insertions(+), 54 deletions(-) diff --git a/du6/list_ops.c b/du6/list_ops.c index 6cd3e6b..79e74c8 100644 --- a/du6/list_ops.c +++ b/du6/list_ops.c @@ -1,10 +1,15 @@ #include "list_ops.h" #include -list_t *new_list(size_t length, list_element_t elements[]) { +static list_t *allocate_list(size_t length) { list_t *list = malloc(sizeof(list_t) + sizeof(list_element_t) * length); + if (list) list->length = length; + return list; +} + +list_t *new_list(size_t length, list_element_t elements[]) { + list_t *list = allocate_list(length); if (!list) return NULL; - list->length = length; if (length && elements) memcpy(list->elements, elements, sizeof(list_element_t) * length); return list; @@ -15,42 +20,28 @@ void delete_list(list_t *list) { } list_t *append_list(list_t *list1, list_t *list2) { - size_t new_length = list1->length + list2->length; - list_t *new_list_ptr = malloc(sizeof(list_t) + sizeof(list_element_t) * new_length); - if (!new_list_ptr) return NULL; + list_t *result = allocate_list(list1->length + list2->length); + if (!result) return NULL; - new_list_ptr->length = new_length; + memcpy(result->elements, list1->elements, sizeof(list_element_t) * list1->length); + memcpy(result->elements + list1->length, list2->elements, sizeof(list_element_t) * list2->length); - for (size_t i = 0; i < list1->length; i++) { - new_list_ptr->elements[i] = list1->elements[i]; - } - for (size_t i = 0; i < list2->length; i++) { - new_list_ptr->elements[list1->length + i] = list2->elements[i]; - } - - return new_list_ptr; + return result; } list_t *filter_list(list_t *list, bool (*filter)(list_element_t)) { size_t count = 0; - - for (size_t i = 0; i < list->length; i++) { + for (size_t i = 0; i < list->length; i++) if (filter(list->elements[i])) count++; - } - list_t *new_list_ptr = malloc(sizeof(list_t) + sizeof(list_element_t) * count); - if (!new_list_ptr) return NULL; + list_t *result = allocate_list(count); + if (!result) return NULL; - new_list_ptr->length = count; + for (size_t i = 0, j = 0; i < list->length; i++) + if (filter(list->elements[i])) + result->elements[j++] = list->elements[i]; - size_t index = 0; - for (size_t i = 0; i < list->length; i++) { - if (filter(list->elements[i])) { - new_list_ptr->elements[index++] = list->elements[i]; - } - } - - return new_list_ptr; + return result; } size_t length_list(list_t *list) { @@ -58,45 +49,35 @@ size_t length_list(list_t *list) { } list_t *map_list(list_t *list, list_element_t (*map)(list_element_t)) { - list_t *new_list_ptr = malloc(sizeof(list_t) + sizeof(list_element_t) * list->length); - if (!new_list_ptr) return NULL; + list_t *result = allocate_list(list->length); + if (!result) return NULL; - new_list_ptr->length = list->length; + for (size_t i = 0; i < list->length; i++) + result->elements[i] = map(list->elements[i]); - for (size_t i = 0; i < list->length; i++) { - new_list_ptr->elements[i] = map(list->elements[i]); - } - - return new_list_ptr; + return result; } list_element_t foldl_list(list_t *list, list_element_t initial, list_element_t (*foldl)(list_element_t, list_element_t)) { - list_element_t result = initial; - for (size_t i = 0; i < list->length; i++) { - result = foldl(result, list->elements[i]); - } - return result; + for (size_t i = 0; i < list->length; i++) + initial = foldl(initial, list->elements[i]); + return initial; } list_element_t foldr_list(list_t *list, list_element_t initial, list_element_t (*foldr)(list_element_t, list_element_t)) { - list_element_t result = initial; - for (int i = (int)list->length - 1; i >= 0; i--) { - result = foldr(list->elements[i], result); - } - return result; + for (size_t i = list->length; i-- > 0;) + initial = foldr(list->elements[i], initial); + return initial; } list_t *reverse_list(list_t *list) { - list_t *new_list_ptr = malloc(sizeof(list_t) + sizeof(list_element_t) * list->length); - if (!new_list_ptr) return NULL; + list_t *result = allocate_list(list->length); + if (!result) return NULL; - new_list_ptr->length = list->length; + for (size_t i = 0; i < list->length; i++) + result->elements[i] = list->elements[list->length - 1 - i]; - for (size_t i = 0; i < list->length; i++) { - new_list_ptr->elements[i] = list->elements[list->length - i - 1]; - } - - return new_list_ptr; + return result; }