From 4cb9c25dc1347864f618c8d745fd17c930081955 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ka=C4=8Dm=C3=A1r?= Date: Thu, 17 Apr 2025 20:02:33 +0000 Subject: [PATCH] Update du6/list_ops.c --- du6/list_ops.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/du6/list_ops.c b/du6/list_ops.c index 1df58f3..197cd6a 100644 --- a/du6/list_ops.c +++ b/du6/list_ops.c @@ -1,14 +1,26 @@ #include #include +#include // pre bool typedef int list_element_t; typedef struct { size_t length; - list_element_t elements[]; // flexibilné pole + list_element_t elements[]; } list_t; -// Vytvorí nový zoznam s danou dĺžkou a prvkami nastavenými na default_value +// ==== Deklarácie funkcií (tzv. prototypy) ==== + +list_t *new_list(size_t length, list_element_t default_value); +list_t *map_list(list_t *list, list_element_t (*map_fn)(list_element_t)); +list_t *filter_list(list_t *list, bool (*filter_fn)(list_element_t)); +list_element_t foldl_list(list_t *list, list_element_t initial, list_element_t (*fold_fn)(list_element_t, list_element_t)); +list_element_t foldr_list(list_t *list, list_element_t initial, list_element_t (*fold_fn)(list_element_t, list_element_t)); +list_t *reverse_list(list_t *list); +void delete_list(list_t *list); + +// ==== Implementácie ==== + list_t *new_list(size_t length, list_element_t default_value) { list_t *list = malloc(sizeof(list_t) + length * sizeof(list_element_t)); if (list == NULL) { @@ -23,7 +35,6 @@ list_t *new_list(size_t length, list_element_t default_value) { return list; } -// Pridá každý prvok zoznamu cez mapovaciu funkciu a vráti nový zoznam list_t *map_list(list_t *list, list_element_t (*map_fn)(list_element_t)) { list_t *result = malloc(sizeof(list_t) + sizeof(list_element_t) * list->length); if (result == NULL) { @@ -39,11 +50,9 @@ list_t *map_list(list_t *list, list_element_t (*map_fn)(list_element_t)) { return result; } -// Vytvorí nový zoznam s prvkami, ktoré spĺňajú filter podmienku list_t *filter_list(list_t *list, bool (*filter_fn)(list_element_t)) { size_t count = 0; - // Najprv zistíme koľko prvkov bude vo výsledku for (size_t i = 0; i < list->length; i++) { if (filter_fn(list->elements[i])) { count++; @@ -68,7 +77,6 @@ list_t *filter_list(list_t *list, bool (*filter_fn)(list_element_t)) { return result; } -// Zredukuje zoznam zľava doprava pomocou fold funkcie list_element_t foldl_list(list_t *list, list_element_t initial, list_element_t (*fold_fn)(list_element_t, list_element_t)) { list_element_t acc = initial; @@ -79,11 +87,9 @@ list_element_t foldl_list(list_t *list, list_element_t initial, list_element_t ( return acc; } -// Zredukuje zoznam sprava doľava pomocou fold funkcie list_element_t foldr_list(list_t *list, list_element_t initial, list_element_t (*fold_fn)(list_element_t, list_element_t)) { list_element_t acc = initial; - // Pozor: size_t je unsigned, preto treba použiť podmienku inak for (size_t i = list->length; i > 0; i--) { acc = fold_fn(list->elements[i - 1], acc); } @@ -91,7 +97,6 @@ list_element_t foldr_list(list_t *list, list_element_t initial, list_element_t ( return acc; } -// Otočí poradie prvkov v zozname list_t *reverse_list(list_t *list) { list_t *result = malloc(sizeof(list_t) + sizeof(list_element_t) * list->length); if (result == NULL) { @@ -107,7 +112,6 @@ list_t *reverse_list(list_t *list) { return result; } -// Uvoľní pamäť alokovanú pre zoznam void delete_list(list_t *list) { free(list); }