diff --git a/du6/list_ops.c b/du6/list_ops.c index 6bf1e07..47df1a4 100644 --- a/du6/list_ops.c +++ b/du6/list_ops.c @@ -1,21 +1,16 @@ #include +#include #include "list_ops.h" -list_t *new_list(size_t length, list_element_t default_value) { - list_t *list = malloc(sizeof(list_t)); +list_t *new_list(size_t length, list_element_t elements[]) { + list_t *list = malloc(sizeof(list_t) + sizeof(list_element_t) * length); list->length = length; - list->elements = malloc(sizeof(list_element_t) * length); - for (size_t i = 0; i < length; ++i) { - list->elements[i] = default_value; - } + memcpy(list->elements, elements, sizeof(list_element_t) * length); return list; } void delete_list(list_t *list) { - if (list) { - free(list->elements); - free(list); - } + free(list); } size_t length_list(list_t *list) { @@ -24,76 +19,72 @@ size_t length_list(list_t *list) { list_t *append_list(list_t *list1, list_t *list2) { size_t total_length = list1->length + list2->length; - list_t *new_list = malloc(sizeof(list_t)); - new_list->length = total_length; - new_list->elements = malloc(sizeof(list_element_t) * total_length); + list_t *result = malloc(sizeof(list_t) + sizeof(list_element_t) * total_length); + result->length = total_length; - for (size_t i = 0; i < list1->length; ++i) { - new_list->elements[i] = list1->elements[i]; - } - for (size_t i = 0; i < list2->length; ++i) { - new_list->elements[list1->length + i] = list2->elements[i]; - } + memcpy(result->elements, list1->elements, sizeof(list_element_t) * list1->length); + memcpy(result->elements + list1->length, list2->elements, sizeof(list_element_t) * list2->length); - return new_list; + return result; } list_t *filter_list(list_t *list, bool (*filter_fn)(list_element_t)) { size_t count = 0; - for (size_t i = 0; i < list->length; ++i) { + + for (size_t i = 0; i < list->length; i++) { if (filter_fn(list->elements[i])) { count++; } } - list_element_t *buffer = malloc(sizeof(list_element_t) * count); + list_element_t *filtered = malloc(sizeof(list_element_t) * count); size_t index = 0; - for (size_t i = 0; i < list->length; ++i) { + for (size_t i = 0; i < list->length; i++) { if (filter_fn(list->elements[i])) { - buffer[index++] = list->elements[i]; + filtered[index++] = list->elements[i]; } } - list_t *new_list = malloc(sizeof(list_t)); + list_t *new_list = malloc(sizeof(list_t) + sizeof(list_element_t) * count); new_list->length = count; - new_list->elements = buffer; + memcpy(new_list->elements, filtered, sizeof(list_element_t) * count); + free(filtered); + return new_list; } list_t *map_list(list_t *list, list_element_t (*map_fn)(list_element_t)) { - list_t *new_list = malloc(sizeof(list_t)); + list_t *new_list = malloc(sizeof(list_t) + sizeof(list_element_t) * list->length); new_list->length = list->length; - new_list->elements = malloc(sizeof(list_element_t) * list->length); - for (size_t i = 0; i < list->length; ++i) { + for (size_t i = 0; i < list->length; i++) { new_list->elements[i] = map_fn(list->elements[i]); } return new_list; } -list_element_t foldl_list(list_t *list, list_element_t init, list_element_t (*fn)(list_element_t, list_element_t)) { - list_element_t acc = init; - for (size_t i = 0; i < list->length; ++i) { - acc = fn(acc, list->elements[i]); +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 result = initial; + for (size_t i = 0; i < list->length; i++) { + result = fold_fn(result, list->elements[i]); } - return acc; + return result; } -list_element_t foldr_list(list_t *list, list_element_t init, list_element_t (*fn)(list_element_t, list_element_t)) { - list_element_t acc = init; - for (size_t i = list->length; i > 0; --i) { - acc = fn(list->elements[i - 1], acc); +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 result = initial; + for (size_t i = list->length; i-- > 0;) { + result = fold_fn(list->elements[i], result); } - return acc; + return result; } list_t *reverse_list(list_t *list) { - list_t *new_list = malloc(sizeof(list_t)); + list_t *new_list = malloc(sizeof(list_t) + sizeof(list_element_t) * list->length); new_list->length = list->length; - new_list->elements = malloc(sizeof(list_element_t) * list->length); - for (size_t i = 0; i < list->length; ++i) { + for (size_t i = 0; i < list->length; i++) { new_list->elements[i] = list->elements[list->length - i - 1]; }