From cc5df1ee8a03c7f827e141436f14f92735e1ccbc Mon Sep 17 00:00:00 2001 From: Mykola Syniavskyi Date: Thu, 17 Apr 2025 18:26:50 +0000 Subject: [PATCH] =?UTF-8?q?P=C5=99idat=20du6/list=5Fops.c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- du6/list_ops.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 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..45d4fa1 --- /dev/null +++ b/du6/list_ops.c @@ -0,0 +1,93 @@ +#include +#include +#include +// Please implement the header file from the assignment to fulfill the unit tests.. + // You can add any function +#include "list_ops.h" + +list_t *new_list(size_t length, list_element_t elements[]) { + list_t *list = malloc(sizeof(list_t) + length * sizeof(list_element_t)); + if (!list) return NULL; + + list->length=length; + + if (length>0 && elements!= NULL) { + memcpy(list->elements, elements, length*sizeof(list_element_t)); + } + return list; +} + +list_t *append_list(list_t *list1, list_t *list2) { + size_t total_length =list1->length+list2->length; + list_t *new_list_ptr=malloc(sizeof(list_t)+total_length*sizeof(list_element_t)); + if (!new_list_ptr) return NULL; + + new_list_ptr->length=total_length; + + memcpy(new_list_ptr->elements, list1->elements, list1->length*sizeof(list_element_t)); + memcpy(new_list_ptr->elements+list1->length, list2->elements, list2->length * sizeof(list_element_t)); + + return new_list_ptr; +} + + +list_t *filter_list(list_t *list, bool (*filter)(list_element_t)) { + list_element_t *temp=malloc(list->length*sizeof(list_element_t)); + if (!temp) return NULL; + size_t count=0; + for (size_t i=0; ilength; i++) { + if (filter(list->elements[i])) { + temp[count++]=list->elements[i]; + } + } + list_t *result=new_list(count, temp); + free(temp); + return result; +} + +size_t length_list(list_t *list) { + return list->length; +} + +list_t *map_list(list_t *list, list_element_t (*map)(list_element_t)) { + list_t *result = malloc(sizeof(list_t) + list->length * sizeof(list_element_t)); + if (!result) return NULL; + result->length = list->length; + for (size_t i = 0; ilength; i++) { + result->elements[i] = map(list->elements[i]); + } + + 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 acc = initial; + for (size_t i=0; ilength; i++) { + acc=foldl(acc, list->elements[i]); + } + return acc; +} + + +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 acc = initial; + for (size_t i=list->length; i-- >0;) { + acc = foldr(list->elements[i], acc); + } + return acc; +} + + +list_t *reverse_list(list_t *list) { + list_t *result = malloc(sizeof(list_t)+list->length*sizeof(list_element_t)); + if (!result) return NULL; + result->length=list->length; + for (size_t i=0; ilength; i++) { + result->elements[i] = list->elements[list->length-i-1]; + } + return result; +} + +void delete_list(list_t *list) { + free(list); +} \ No newline at end of file