From fdf03ad8142cafe4e832142cf97b7167f703dff7 Mon Sep 17 00:00:00 2001 From: Weber Date: Wed, 13 Mar 2024 22:54:29 +0000 Subject: [PATCH] skuska --- cv4/program.c | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) diff --git a/cv4/program.c b/cv4/program.c index e69de29..d77de7a 100644 --- a/cv4/program.c +++ b/cv4/program.c @@ -0,0 +1,99 @@ +#include "list_ops.h" +#include +#include +#include + +// Funkcia na vytvorenie nového zoznamu s danou dĺžkou +list_t *new_list(size_t length, list_element_t elements[]) { + list_t *list = malloc(sizeof(list_t) + length * sizeof(list_element_t)); //alokacia pamete pre novy prvok + if (list != NULL) { + list->length = length; //nastavenie dlzky zoznamu + memcpy(list->elements, elements, length * sizeof(list_element_t)); // skopíruje prvky do nového zoznamu + } + return list; +} + +// Funkcia na pridanie zoznamu list2 na koniec zoznamu list1 +list_t *append_list(list_t *list1, list_t *list2) { + + size_t total_length = list1->length + list2->length; //celkova dlzka zoznamu po pridani + list_t *result = malloc(sizeof(list_t) + total_length * sizeof(list_element_t)); // alokovanie pamete pre vysledny zoznam + if (result != NULL) { + result->length = total_length; // dlzka vysledneho zoznamu + memcpy(result->elements, list1->elements, list1->length * sizeof(list_element_t)); // skopíruje list1 do výsledného zoznamu + memcpy(result->elements + list1->length, list2->elements, list2->length * sizeof(list_element_t)); // skopíruje list2 na koniec výsledného zoznamu + } + return result; +} + +// Funkcia na filtrovanie zoznamu podľa zadaného filtra +list_t *filter_list(list_t *list, bool (*filter)(list_element_t)) { + list_t *result = malloc(sizeof(list_t) + list->length * sizeof(list_element_t)); + if (result != NULL) { + result->length = 0; // nastavy dĺžku výsledného zoznamu na 0 + for (size_t i = 0; i < list->length; ++i) {// prechadzanie cez vstupny zoznam + if (filter(list->elements[i])) { // aplikuje filter na každý prvok vstupného zoznamu + result->elements[result->length++] = list->elements[i]; // Ak filter vráti true, pridá prvok do výsledného zoznamu + } + } + } + return result; +} + +// Funkcia na získanie dĺžky zoznamu +size_t length_list(list_t *list) { + return list->length; +} + +// Funkcia na mapovanie zoznamu podľa danej funkcie mapovania +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));// allokuje pamäť pre výsledný zoznam + if (result != NULL) { + result->length = list->length; // nastaví dĺžku výsledného zoznamu + for (size_t i = 0; i < list->length; ++i) { + result->elements[i] = map(list->elements[i]); // aplikuje mapovaciu funkciu na každý prvok vstupného zoznamu + } + } + return result; +} + +// Funkcia na zredukciu zoznamu zľava +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 accumulator = initial; + for (size_t i = 0; i < list->length; ++i) {// Prechádza cez prvky vstupného zoznamu + accumulator = foldl(list->elements[i], accumulator); + } + return accumulator; +} + +// Funkcia na zredukciu zoznamu zprava +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 accumulator = initial; + for (size_t i = list->length; i > 0; --i) { // Prechádza cez prvky vstupného zoznamu v opačnom poradí + accumulator = foldr(list->elements[i - 1], accumulator); + } + return accumulator; +} + +// Funkcia na reverznutie zoznamu +list_t *reverse_list(list_t *list) { + list_t *result = malloc(sizeof(list_t) + list->length * sizeof(list_element_t)); // allokuje pamäť pre výsledný zoznam + if (result != NULL) { + result->length = list->length; // nastaví dĺžku výsledného zoznamu + for (size_t i = 0; i < list->length; ++i) { // prechádza cez prvky vstupného zoznamu + + result->elements[i] = list->elements[list->length - i - 1]; // kopíruje prvky z vstupného zoznamu do výsledného v opačnom poradí + } + } + return result; +} + + +void delete_list(list_t *list) { + free(list); +} \ No newline at end of file