#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); }