forked from vieter-v/libvieter
				
			feat(heap): possibly working pop
							parent
							
								
									95d8c9972b
								
							
						
					
					
						commit
						6845e67cb6
					
				|  | @ -51,23 +51,23 @@ vieter_heap_error vieter_heap_insert(vieter_heap *heap, uint64_t key, | ||||||
|   return vieter_heap_ok; |   return vieter_heap_ok; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* vieter_heap_error vieter_heap_pop(void **out, vieter_heap *heap) { */ | vieter_heap_error vieter_heap_pop(void **out, vieter_heap *heap) { | ||||||
| /*   if (heap->tree == NULL) { */ |   if (heap->tree == NULL) { | ||||||
| /*     return vieter_heap_empty; */ |     return vieter_heap_empty; | ||||||
| /*   } */ |   } | ||||||
| 
 | 
 | ||||||
| /*   if (heap->tree->order == 0) { */ |   if (heap->tree->order == 0 && heap->tree->ptr.next_tree == NULL) { | ||||||
| /*     *out = heap->tree->root->data; */ |     *out = heap->tree->data; | ||||||
| /*     vieter_heap_tree_free(heap->tree); */ |     vieter_heap_tree_free(heap->tree); | ||||||
| /*     heap->tree = NULL; */ |     heap->tree = NULL; | ||||||
| 
 | 
 | ||||||
| /*     return vieter_heap_ok; */ |     return vieter_heap_ok; | ||||||
| /*   } */ |   } | ||||||
| 
 | 
 | ||||||
| /*   vieter_heap_tree_pop(out, heap->tree); */ |   heap->tree = vieter_heap_tree_pop(out, heap->tree); | ||||||
| 
 | 
 | ||||||
| /*   return vieter_heap_ok; */ |   return vieter_heap_ok; | ||||||
| /* } */ | } | ||||||
| 
 | 
 | ||||||
| vieter_heap_error vieter_heap_peek(void **out, vieter_heap *heap) { | vieter_heap_error vieter_heap_peek(void **out, vieter_heap *heap) { | ||||||
|   if (heap->tree == NULL) { |   if (heap->tree == NULL) { | ||||||
|  |  | ||||||
|  | @ -41,18 +41,6 @@ end: | ||||||
|   vieter_heap_node_free(root); |   vieter_heap_node_free(root); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* vieter_heap_tree *vieter_heap_tree_init(vieter_heap_node *root, */ |  | ||||||
| /*                                         vieter_heap_tree *next, uint8_t
 |  | ||||||
|  * order) { */ |  | ||||||
| /*   vieter_heap_tree *tree = malloc(sizeof(vieter_heap_tree)); */ |  | ||||||
| 
 |  | ||||||
| /*   tree->root = root; */ |  | ||||||
| /*   tree->next = next; */ |  | ||||||
| /*   tree->order = order; */ |  | ||||||
| 
 |  | ||||||
| /*   return tree; */ |  | ||||||
| /* } */ |  | ||||||
| 
 |  | ||||||
| vieter_heap_node *vieter_heap_tree_merge_same_order(vieter_heap_node *root_a, | vieter_heap_node *vieter_heap_tree_merge_same_order(vieter_heap_node *root_a, | ||||||
|                                                     vieter_heap_node *root_b) { |                                                     vieter_heap_node *root_b) { | ||||||
|   vieter_heap_node *new_root; |   vieter_heap_node *new_root; | ||||||
|  | @ -144,52 +132,61 @@ vieter_heap_node *vieter_heap_tree_merge(vieter_heap_node *root_a, | ||||||
|   return out; |   return out; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* vieter_heap_tree *vieter_heap_tree_pop(void **out, vieter_heap_tree *tree) {
 | vieter_heap_node *vieter_heap_tree_pop(void **out, vieter_heap_node *tree) { | ||||||
|  */ |   vieter_heap_node *tree_before_smallest = NULL; | ||||||
| /*   vieter_heap_tree *tree_before_smallest = NULL; */ |   vieter_heap_node *previous_tree = NULL; | ||||||
| /*   vieter_heap_tree *previous_tree = NULL; */ |   vieter_heap_node *original_root = tree; | ||||||
| /*   vieter_heap_tree *tree_out = tree; */ |  | ||||||
| 
 | 
 | ||||||
| /*   uint64_t smallest_key = tree->root->key; */ |   uint64_t smallest_key = tree->key; | ||||||
| 
 | 
 | ||||||
| /*   while (tree->next != NULL) { */ |   while (tree->ptr.next_tree != NULL) { | ||||||
| /*     previous_tree = tree; */ |     previous_tree = tree; | ||||||
| /*     tree = tree->next; */ |     tree = tree->ptr.next_tree; | ||||||
| 
 | 
 | ||||||
| /*     if (tree->root->key < smallest_key) { */ |     if (tree->key < smallest_key) { | ||||||
| /*       smallest_key = tree->root->key; */ |       smallest_key = tree->key; | ||||||
| /*       *out = tree->root->data; */ |       tree_before_smallest = previous_tree; | ||||||
| /*       tree_before_smallest = previous_tree; */ |     } | ||||||
| /*     } */ |   } | ||||||
| /*   } */ |  | ||||||
| 
 | 
 | ||||||
| /*   if (tree_before_smallest != NULL) { */ |   vieter_heap_node *tree_to_pop; | ||||||
| /*     previous_tree->next = tree->next; */ |  | ||||||
| /*   } else { */ |  | ||||||
| /*     tree_out = tree_out->next; */ |  | ||||||
| /*   } */ |  | ||||||
| 
 | 
 | ||||||
| /*   if (tree->order == 0) { */ |   if (tree_before_smallest != NULL) { | ||||||
| /*     vieter_heap_tree_free(tree); */ |     tree_to_pop = tree_before_smallest->ptr.next_tree; | ||||||
|  |     tree_before_smallest->ptr.next_tree = tree_to_pop->ptr.next_tree; | ||||||
|  |   } else { | ||||||
|  |     tree_to_pop = original_root; | ||||||
|  |     original_root = original_root->ptr.next_tree; | ||||||
|  |   } | ||||||
| 
 | 
 | ||||||
| /*     return NULL; */ |   *out = tree_to_pop->data; | ||||||
| /*   } */ |  | ||||||
| 
 | 
 | ||||||
| /*   uint8_t old_order = tree->order; */ |   if (tree_to_pop->order == 0) { | ||||||
|  |     vieter_heap_tree_free(tree_to_pop); | ||||||
| 
 | 
 | ||||||
| /*   vieter_heap_node *node = tree->root->largest_order; */ |     return original_root; | ||||||
| /*   free(tree->root); */ |   } | ||||||
| 
 | 
 | ||||||
| /*   previous_tree = vieter_heap_tree_init(node, NULL, old_order - 1); */ |   previous_tree = tree_to_pop->largest_order; | ||||||
|  |   vieter_heap_node_free(tree_to_pop); | ||||||
| 
 | 
 | ||||||
| /*   uint8_t i = 2; */ |   tree = previous_tree->ptr.next_largest_order; | ||||||
| /*   while (node->next_largest_order != NULL) { */ |   previous_tree->ptr.next_tree = NULL; | ||||||
| /*     node = node->next_largest_order; */ |  | ||||||
| /*     previous_tree = vieter_heap_tree_init(node, previous_tree, old_order -
 |  | ||||||
|  * i); */ |  | ||||||
| 
 | 
 | ||||||
| /*     i++; */ |   vieter_heap_node *next_tree; | ||||||
| /*   } */ |  | ||||||
| 
 | 
 | ||||||
| /*   return vieter_heap_tree_merge(tree_out, previous_tree); */ |   while (tree != NULL) { | ||||||
| /* } */ |     next_tree = tree->ptr.next_largest_order; | ||||||
|  |     tree->ptr.next_tree = previous_tree; | ||||||
|  | 
 | ||||||
|  |     previous_tree = 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; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -51,35 +51,35 @@ void test_insert() { | ||||||
|     vieter_heap_free(heap); |     vieter_heap_free(heap); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* void test_pop() { */ | void test_pop() { | ||||||
| /*     vieter_heap *heap = vieter_heap_init(); */ |     vieter_heap *heap = vieter_heap_init(); | ||||||
| /*     TEST_SIZE(heap, 0); */ |     TEST_SIZE(heap, 0); | ||||||
| 
 | 
 | ||||||
| /*     void *data; */ |     void *data; | ||||||
| 
 | 
 | ||||||
| /*     for (uint64_t i = 50; i > 0; i--) { */ |     for (uint64_t i = 50; i > 0; i--) { | ||||||
| /*         vieter_heap_insert(heap, i, (void *)i); */ |         vieter_heap_insert(heap, i, (void *)i); | ||||||
| /*         TEST_SIZE(heap, (uint64_t)51 - i); */ |         TEST_SIZE(heap, (uint64_t)51 - i); | ||||||
| 
 | 
 | ||||||
| /*         TEST_CHECK(vieter_heap_peek(&data, heap) == vieter_heap_ok); */ |         TEST_CHECK(vieter_heap_peek(&data, heap) == vieter_heap_ok); | ||||||
| /*         TEST_CHECK(data == (void*)i); */ |         TEST_CHECK(data == (void*)i); | ||||||
| /*     } */ |     } | ||||||
| 
 | 
 | ||||||
| /*     data = NULL; */ |     data = NULL; | ||||||
| 
 | 
 | ||||||
| /*     for (uint64_t i = 1; i <= 50; i++) { */ |     for (uint64_t i = 1; i <= 50; i++) { | ||||||
| /*         TEST_CHECK(vieter_heap_pop(&data, heap) == vieter_heap_ok); */ |         TEST_CHECK(vieter_heap_pop(&data, heap) == vieter_heap_ok); | ||||||
| /*         TEST_CHECK(data == (void*)i); */ |         TEST_CHECK(data == (void*)i); | ||||||
| /*         TEST_SIZE(heap, (uint64_t)50 - i); */ |         TEST_SIZE(heap, (uint64_t)50 - i); | ||||||
| /*     } */ |     } | ||||||
| 
 | 
 | ||||||
| /*     vieter_heap_free(heap); */ |     vieter_heap_free(heap); | ||||||
| /* } */ | } | ||||||
| 
 | 
 | ||||||
| TEST_LIST = { | TEST_LIST = { | ||||||
|     {"init", test_init}, |     {"init", test_init}, | ||||||
|     {"merge same order", test_merge_same_order}, |     {"merge same order", test_merge_same_order}, | ||||||
|     {"insert", test_insert}, |     {"insert", test_insert}, | ||||||
|     /* {"pop", test_pop}, */ |     {"pop", test_pop}, | ||||||
|     {NULL, NULL} |     {NULL, NULL} | ||||||
| }; | }; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue