#ifndef VIETER_HEAP_TREE #define VIETER_HEAP_TREE #include #include typedef struct vieter_heap_node { uint64_t key; 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 and 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); /* * Deallocate a node's entire 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