du6
This commit is contained in:
		
							parent
							
								
									bf544a702c
								
							
						
					
					
						commit
						6bfac49484
					
				
							
								
								
									
										78
									
								
								du6/list_ops.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								du6/list_ops.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,78 @@ | ||||
| #include "list_ops.h" | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <stdio.h> | ||||
| 
 | ||||
| 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; | ||||
|     if(length && elements) | ||||
|         memcpy(list->elements, elements, length * sizeof(list_element_t)); | ||||
|     return list; | ||||
| } | ||||
| 
 | ||||
| list_t *append_list(list_t *list1, list_t *list2){ | ||||
|     size_t new_len = list1->length + list2->length; | ||||
|     list_t *new_list = malloc(sizeof(list_t) + sizeof(list_element_t) * new_len); | ||||
|     new_list->length = new_len; | ||||
|     memcpy(new_list->elements, list1->elements, list1->length * sizeof(list_element_t)); | ||||
|     memcpy(new_list->elements + list1->length, list2->elements, list2->length * sizeof(list_element_t)); | ||||
|     return new_list; | ||||
| } | ||||
| 
 | ||||
| list_t *filter_list(list_t *list, bool (*filter)(list_element_t)){ | ||||
|     list_element_t *buffer = malloc(sizeof(list_element_t) * list->length); | ||||
|     size_t new_len = 0; | ||||
|     for(size_t i = 0; i < list->length; i++){ | ||||
|         if(filter(list->elements[i])){ | ||||
|             buffer[new_len++] = list->elements[i]; | ||||
|         } | ||||
|     } | ||||
|     list_t *new_list = malloc(sizeof(list_t) + sizeof(list_element_t) * new_len); | ||||
|     new_list->length = new_len; | ||||
|     memcpy(new_list->elements, buffer, new_len * sizeof(list_element_t)); | ||||
|     free(buffer); | ||||
|     return new_list; | ||||
| } | ||||
| 
 | ||||
| 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 *new_list = malloc(sizeof(list_t) + sizeof(list_element_t) * list->length); | ||||
|     new_list->length = list->length; | ||||
|     for(size_t i = 0; i < list->length; i++){ | ||||
|         new_list->elements[i] = map(list->elements[i]); | ||||
|     } | ||||
|     return new_list; | ||||
| } | ||||
| 
 | ||||
| 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; i < list->length; 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; i--){ | ||||
|         acc = foldr(list->elements[i - 1], acc); | ||||
|     } | ||||
|     return acc; | ||||
| } | ||||
| 
 | ||||
| list_t *reverse_list(list_t *list){ | ||||
|     list_t *new_list = malloc(sizeof(list_t) + sizeof(list_element_t) * list->length); | ||||
|     new_list->length = list->length; | ||||
|     for(size_t i = 0; i < list->length; i++){ | ||||
|         new_list->elements[i] = list->elements[list->length - 1 - i]; | ||||
|     } | ||||
|     return new_list; | ||||
| } | ||||
| 
 | ||||
| void delete_list(list_t *list){ | ||||
|     free(list); | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user