forked from vieter-v/libvieter
54 lines
1.3 KiB
C
54 lines
1.3 KiB
C
#ifndef VIETER_HEAP_TREE
|
|
#define VIETER_HEAP_TREE
|
|
|
|
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
|
|
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
|