dsa-c
 
Loading...
Searching...
No Matches
rbtree_example.c

Example of how rbtree.h header file is used in practice.

#include <stdio.h>
#include "rbtree.h"
#include "container_of.h"
typedef struct {
struct rbtree_node node; // note: should be first member, if following C standard strictly.
// attached values:
char c;
} con_type;
#define arr_count(arr) sizeof(arr) / sizeof(*arr)
static void inorder_traverse_and_putchar(struct rbtree_node *n)
{
if (n == NULL) {
return;
}
const char c = container_of(n, con_type, node)->c;
inorder_traverse_and_putchar(n->left_ptr);
putchar(c);
inorder_traverse_and_putchar(n->right_ptr);
}
static void deallocate(void *ptr)
{
// do nothing. exists for demonstration purposes
(void)(ptr);
}
void hello_world(void)
{
struct {
int key;
char c;
} pairs[] = {
{-1, '$'}, {4, 'o'}, {11, '!'}, {2, 'l'}, {0, 'h'}, {6, 'w'}, {12, '\n'}, {5, ' '},
{7, 'o'}, {10, 'd'}, {9, 'l'}, {1, 'e'}, {3, 'l'}, {8, 'r'}, {13, '\0'},
};
struct rbtree_node *rb;
assert(rbtree_is_empty(&rb));
con_type cons[arr_count(pairs)];
for (size_t i = 0; i < arr_count(pairs); i++) {
cons[i].c = pairs[i].c;
rbtree_node_init(&cons[i].node, pairs[i].key);
if (!rbtree_contains_key(&rb, pairs[i].key)) {
rbtree_insert_node(&rb, &cons[i].node);
}
else {
assert(false);
}
}
struct rbtree_node *node_ptr = rbtree_search_node(&rb, -1);
if (node_ptr) {
deallocate(rbtree_delete_node(&rb, node_ptr));
}
else {
assert(false);
}
/* inorder_traverse_and_putchar(rb); */
(void)(inorder_traverse_and_putchar);
}
int main(void)
{
hello_world();
}
rbtree_node_type * rbtree_search_node(rbtree_node_type **rootptr_ptr, const KEY_TYPE key)
Search for a given node and return a pointer to the node.
Definition rbtree_template.h:415
bool rbtree_is_empty(rbtree_node_type **rootptr_ptr)
Check if the tree is empty.
Definition rbtree_template.h:384
rbtree_node_type * rbtree_delete_node(rbtree_node_type **rootptr_ptr, rbtree_node_type *node_ptr)
Delete a given node from the tree.
Definition rbtree_template.h:478
bool rbtree_contains_key(rbtree_node_type **rootptr_ptr, const KEY_TYPE key)
Check if the tree contains a given key.
Definition rbtree_template.h:391
void rbtree_node_init(rbtree_node_type *node_ptr, KEY_TYPE key)
Initialize a red-black tree node.
Definition rbtree_template.h:354
void rbtree_init(rbtree_node_type **rootptr_ptr)
Initialize a red-black tree struct.
Definition rbtree_template.h:347
void rbtree_insert_node(rbtree_node_type **rootptr_ptr, rbtree_node_type *node_ptr)
Insert a given node with a key in the tree.
Definition rbtree_template.h:438
Generated red-black tree node struct type for a given KEY_TYPE.
Definition rbtree_template.h:175
rbtree_node_type * left_ptr
pointer to left node
Definition rbtree_template.h:183
KEY_TYPE key
node key
Definition rbtree_template.h:189
rbtree_node_type * right_ptr
pointer to right node
Definition rbtree_template.h:184