diff --git a/du6/list_ops.c b/du6/list_ops.c index 197cd6a..ec448f1 100644 --- a/du6/list_ops.c +++ b/du6/list_ops.c @@ -1,6 +1,6 @@ -#include -#include -#include // pre bool + #include +#include +#include typedef int list_element_t; @@ -9,109 +9,128 @@ typedef struct { list_element_t elements[]; } list_t; -// ==== Deklarácie funkcií (tzv. prototypy) ==== - +// Deklarácie funkcií 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_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); +list_t *append_list(list_t *list1, list_t *list2); +size_t length_list(list_t *list); -// ==== Implementácie ==== - +// Vytvorí nový zoznam a naplní ho default hodnotou 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) { - return NULL; - } + if (!list) return NULL; list->length = length; for (size_t i = 0; i < length; i++) { list->elements[i] = default_value; } - return list; } +// Mapovanie: aplikuje funkciu na každý prvok zoznamu 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) { - return NULL; - } - - result->length = list->length; + list_t *new = malloc(sizeof(list_t) + list->length * sizeof(list_element_t)); + if (!new) return NULL; + new->length = list->length; for (size_t i = 0; i < list->length; i++) { - result->elements[i] = map_fn(list->elements[i]); + new->elements[i] = map_fn(list->elements[i]); } - - return result; + return new; } +// Filter: ponechá len tie prvky, ktoré spĺňajú podmienku list_t *filter_list(list_t *list, bool (*filter_fn)(list_element_t)) { size_t count = 0; + // Zistíme koľko prvkov prejde filtrom for (size_t i = 0; i < list->length; i++) { if (filter_fn(list->elements[i])) { count++; } } - list_t *result = malloc(sizeof(list_t) + sizeof(list_element_t) * count); - if (result == NULL) { - return NULL; - } + list_t *filtered = malloc(sizeof(list_t) + count * sizeof(list_element_t)); + if (!filtered) return NULL; - result->length = count; - size_t index = 0; + filtered->length = count; + size_t j = 0; for (size_t i = 0; i < list->length; i++) { if (filter_fn(list->elements[i])) { - result->elements[index] = list->elements[i]; - index++; + filtered->elements[j++] = list->elements[i]; } } - return result; + return filtered; } -list_element_t foldl_list(list_t *list, list_element_t initial, list_element_t (*fold_fn)(list_element_t, list_element_t)) { +// Foldl: zľava doprava +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; - for (size_t i = 0; i < list->length; i++) { acc = fold_fn(acc, list->elements[i]); } - return acc; } -list_element_t foldr_list(list_t *list, list_element_t initial, list_element_t (*fold_fn)(list_element_t, list_element_t)) { +// Foldr: sprava doľava +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; - - for (size_t i = list->length; i > 0; i--) { - acc = fold_fn(list->elements[i - 1], acc); + // pozor: `size_t` nemôže byť záporné, takže kontrolujeme ručne + for (size_t i = list->length; i-- > 0;) { + acc = fold_fn(list->elements[i], acc); } - return acc; } +// Otočí zoznam list_t *reverse_list(list_t *list) { - list_t *result = malloc(sizeof(list_t) + sizeof(list_element_t) * list->length); - if (result == NULL) { - return NULL; - } + list_t *reversed = malloc(sizeof(list_t) + list->length * sizeof(list_element_t)); + if (!reversed) return NULL; - result->length = list->length; + reversed->length = list->length; for (size_t i = 0; i < list->length; i++) { - result->elements[i] = list->elements[list->length - 1 - i]; + reversed->elements[i] = list->elements[list->length - 1 - i]; + } + return reversed; +} + +// Uvoľní pamäť zoznamu +void delete_list(list_t *list) { + free(list); +} + +// Spojí dva zoznamy +list_t *append_list(list_t *list1, list_t *list2) { + size_t new_length = list1->length + list2->length; + list_t *result = malloc(sizeof(list_t) + new_length * sizeof(list_element_t)); + if (!result) return NULL; + + result->length = new_length; + + for (size_t i = 0; i < list1->length; i++) { + result->elements[i] = list1->elements[i]; + } + + for (size_t i = 0; i < list2->length; i++) { + result->elements[list1->length + i] = list2->elements[i]; } return result; } -void delete_list(list_t *list) { - free(list); -} +// Vráti dĺžku zoznamu +size_t length_list(list_t *list) { + return list->length; +} \ No newline at end of file