Compare commits
	
		
			1 Commits 
		
	
	
		
			63100c5b99
			...
			0ec37a89f2
		
	
	| Author | SHA1 | Date | 
|---|---|---|
|  | 0ec37a89f2 | 
|  | @ -56,7 +56,7 @@ vieter_heap_error vieter_heap_pop(void **out, vieter_heap *heap) { | |||
|     return vieter_heap_empty; | ||||
|   } | ||||
| 
 | ||||
|   if (heap->tree->order == 0 && heap->tree->ptr.next_tree == NULL) { | ||||
|   if (heap->tree->order == 0) { | ||||
|     *out = heap->tree->data; | ||||
|     vieter_heap_tree_free(heap->tree); | ||||
|     heap->tree = NULL; | ||||
|  |  | |||
|  | @ -162,7 +162,7 @@ vieter_heap_node *vieter_heap_tree_pop(void **out, vieter_heap_node *tree) { | |||
|   *out = tree_to_pop->data; | ||||
| 
 | ||||
|   if (tree_to_pop->order == 0) { | ||||
|     vieter_heap_tree_free(tree_to_pop); | ||||
|     vieter_heap_tree_free(tree); | ||||
| 
 | ||||
|     return original_root; | ||||
|   } | ||||
|  | @ -183,10 +183,5 @@ vieter_heap_node *vieter_heap_tree_pop(void **out, vieter_heap_node *tree) { | |||
|     tree = next_tree; | ||||
|   } | ||||
| 
 | ||||
|   // original_root is zero if the heap only contained a single tree.
 | ||||
|   if (original_root != NULL) { | ||||
|   return vieter_heap_tree_merge(original_root, previous_tree); | ||||
|   } else { | ||||
|     return previous_tree; | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -9,45 +9,28 @@ typedef struct vieter_heap_node { | |||
|     void *data; | ||||
|     struct vieter_heap_node *largest_order; | ||||
|     union { | ||||
|       // Roots point to next tree in the heap, other nodes point to their first
 | ||||
|       // neighbour.
 | ||||
|         struct vieter_heap_node *next_tree; | ||||
|         struct vieter_heap_node *next_largest_order; | ||||
|     } ptr; | ||||
|     uint8_t order; | ||||
| } vieter_heap_node; | ||||
| 
 | ||||
| /*
 | ||||
|  * Allocate an initialize a heap node object. | ||||
|  */ | ||||
| vieter_heap_node *vieter_heap_node_init(); | ||||
| 
 | ||||
| /*
 | ||||
|  * Deallocate a node object. | ||||
|  */ | ||||
| void vieter_heap_node_free(vieter_heap_node *node); | ||||
| 
 | ||||
| /* vieter_heap_tree *vieter_heap_tree_init(vieter_heap_node *root, vieter_heap_tree *next, uint8_t order); */ | ||||
| 
 | ||||
| /*
 | ||||
|  * Deallocate a node's entire structure. | ||||
|  * Deallocate a tree object, along with its underlying tree structure. | ||||
|  */ | ||||
| void vieter_heap_tree_free(vieter_heap_node *root); | ||||
| 
 | ||||
| /*
 | ||||
|  * Given the roots of the smallest trees in two heaps, merge them into a single | ||||
|  * large heap. | ||||
|  */ | ||||
| vieter_heap_node *vieter_heap_tree_merge(vieter_heap_node *root_a, vieter_heap_node *root_b); | ||||
| 
 | ||||
| /*
 | ||||
|  * Given the roots of two trees of the same order, merge them into a heap of one | ||||
|  * order larger. | ||||
|  */ | ||||
| vieter_heap_node *vieter_heap_tree_merge_same_order(vieter_heap_node *root_a, | ||||
|                                                     vieter_heap_node *root_b); | ||||
| 
 | ||||
| /*
 | ||||
|  * Remove the smallest element from the given heap. | ||||
|  */ | ||||
| vieter_heap_node *vieter_heap_tree_pop(void **out, vieter_heap_node *root); | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
|  | @ -1,7 +1,6 @@ | |||
| #include "acutest.h" | ||||
| #include "vieter_heap.h" | ||||
| #include "vieter_heap_tree.h" | ||||
| #include <stdlib.h> | ||||
| 
 | ||||
| #define TEST_SIZE(heap, size) \ | ||||
|     TEST_CHECK(vieter_heap_size(heap) == size); \ | ||||
|  | @ -77,57 +76,10 @@ void test_pop() { | |||
|     vieter_heap_free(heap); | ||||
| } | ||||
| 
 | ||||
| int uint64_t_compare(const void *a, const void *b) { | ||||
|     if ((*(uint64_t *)a) < (*(uint64_t *)b)) { | ||||
|         return -1; | ||||
|     } else if ((*(uint64_t *)a) < (*(uint64_t *)b)) { | ||||
|         return 1; | ||||
|     } else { | ||||
|         return 0; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void test_pop_random() { | ||||
|     srand(0); | ||||
| 
 | ||||
|     vieter_heap *heap = vieter_heap_init(); | ||||
| 
 | ||||
|     uint64_t *numbers = malloc(500 * sizeof(uint64_t)); | ||||
|     uint64_t num; | ||||
| 
 | ||||
|     for (uint64_t i = 0; i < 500; i++) { | ||||
|         num = rand(); | ||||
|         vieter_heap_insert(heap, num, (void *)num); | ||||
|         TEST_SIZE(heap, i + 1); | ||||
| 
 | ||||
|         numbers[i] = num; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     qsort(numbers, 500, sizeof(uint64_t), uint64_t_compare); | ||||
| 
 | ||||
|     void *data = NULL; | ||||
| 
 | ||||
|     for (uint64_t i = 0; i < 500; i++) { | ||||
|         TEST_CHECK(vieter_heap_peek(&data, heap) == vieter_heap_ok); | ||||
|         TEST_CHECK(data == (void *)numbers[i]); | ||||
| 
 | ||||
|         data = NULL; | ||||
| 
 | ||||
|         TEST_CHECK(vieter_heap_pop(&data, heap) == vieter_heap_ok); | ||||
|         TEST_CHECK(data == (void *)numbers[i]); | ||||
|         TEST_SIZE(heap, (uint64_t)500 - i - 1); | ||||
|     } | ||||
| 
 | ||||
|     vieter_heap_free(heap); | ||||
|     free(numbers); | ||||
| } | ||||
| 
 | ||||
| TEST_LIST = { | ||||
|     {"init", test_init}, | ||||
|     {"merge same order", test_merge_same_order}, | ||||
|     {"insert", test_insert}, | ||||
|     {"pop", test_pop}, | ||||
|     {"pop random", test_pop_random}, | ||||
|     {NULL, NULL} | ||||
| }; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue