From 6be3a93b4d44b01ae751e82b4d867745fc6b33e4 Mon Sep 17 00:00:00 2001 From: Bohdana Marchenko Date: Thu, 17 Apr 2025 16:12:47 +0000 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20du6/list=5Fops.c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- du6/list_ops.c | 103 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 du6/list_ops.c diff --git a/du6/list_ops.c b/du6/list_ops.c new file mode 100644 index 0000000..365db45 --- /dev/null +++ b/du6/list_ops.c @@ -0,0 +1,103 @@ +#include "list_ops.h" +#include + +// constructs a new list +list_t *new_list(size_t length, list_element_t elements[]) { + list_t *list = (list_t *)malloc(sizeof(list_t) + length * sizeof(list_element_t)); + if (!list) { + return NULL; + } + list->length = length; + memcpy(list->elements, elements, length * sizeof(list_element_t)); + return list; +} + +// append entries to a list and return the new list +list_t *append_list(list_t *list1, list_t *list2) { + size_t new_length = list1->length + list2->length; + list_t *new_list = (list_t *)malloc(sizeof(list_t) + new_length * sizeof(list_element_t)); + if (!new_list) { + return NULL; + } + new_list->length = new_length; + memcpy(new_list->elements, list1->elements, list1->length * sizeof(list_element_t)); + memcpy(new_list->elements + list1->length, list2->elements, list2->length * sizeof(list_element_t)); + return new_list; +} + +// filter list returning only values that satisfy the filter function +list_t *filter_list(list_t *list, bool (*filter)(list_element_t)) { + list_element_t *temp = (list_element_t *)malloc(list->length * sizeof(list_element_t)); + if (!temp) { + return NULL; + } + size_t count = 0; + for (size_t i = 0; i < list->length; i++) { + if (filter(list->elements[i])) { + temp[count++] = list->elements[i]; + } + } + list_t *filtered_list = (list_t *)malloc(sizeof(list_t) + count * sizeof(list_element_t)); + if (!filtered_list) { + free(temp); + return NULL; + } + filtered_list->length = count; + memcpy(filtered_list->elements, temp, count * sizeof(list_element_t)); + free(temp); + return filtered_list; +} + +// returns the length of the list +size_t length_list(list_t *list) { + return list->length; +} + +// return a list of elements whose values equal the list value transformed by the mapping function +list_t *map_list(list_t *list, list_element_t (*map)(list_element_t)) { + list_t *mapped_list = (list_t *)malloc(sizeof(list_t) + list->length * sizeof(list_element_t)); + if (!mapped_list) { + return NULL; + } + mapped_list->length = list->length; + for (size_t i = 0; i < list->length; i++) { + mapped_list->elements[i] = map(list->elements[i]); + } + return mapped_list; +} + +// folds (reduces) the given list from the left with a function +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; +} + +// folds (reduces) the given list from the right with a function +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 (size_t i = list->length; i > 0; i--) { + result = foldr(list->elements[i - 1], result); + } + return result; +} + +// reverse the elements of the list +list_t *reverse_list(list_t *list) { + list_t *reversed_list = (list_t *)malloc(sizeof(list_t) + list->length * sizeof(list_element_t)); + if (!reversed_list) { + return NULL; + } + reversed_list->length = list->length; + for (size_t i = 0; i < list->length; i++) { + reversed_list->elements[i] = list->elements[list->length - i - 1]; + } + return reversed_list; +} + +// destroy the entire list +void delete_list(list_t *list) { + free(list); +}