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