diff --git a/Include/Fledasty/Trees/RedBlackTree.h b/Include/Fledasty/Trees/RedBlackTree.h index 9344a20..f88f3d8 100644 --- a/Include/Fledasty/Trees/RedBlackTree.h +++ b/Include/Fledasty/Trees/RedBlackTree.h @@ -46,6 +46,45 @@ typedef struct FledastyRedBlackTreeNode_##name { typedef struct { \ size_t size; \ FledastyRedBlackTreeNode_##name *top; \ -} FledastyRedBlackTree_##name; +} FledastyRedBlackTree_##name; \ + \ +FledastyError fledasty_red_black_tree_##name##_free(FledastyRedBlackTree_##name *current_red_black_tree); \ + +#define FLEDASTY_RED_BLACK_TREE_IMPLEMENT(key_type, value_type, name, compare_key_function, key_less_than_function) \ +FledastyError fledasty_red_black_tree_##name##_free(FledastyRedBlackTree_##name *current_red_black_tree) { \ + if (current_red_black_tree != NULL) { \ + return FLEDASTY_ERROR_INVALID_POINTER; \ + } \ + \ + FledastyRedBlackTreeNode_##name *current_node = current_red_black_tree->top; \ + while (current_node != NULL) { \ + if (current_node->left != NULL) { \ + current_node = current_node->left; \ + } else if (current_node->right != NULL) { \ + current_node = current_node->right; \ + } else if (current_node->parent != NULL) { \ + current_node = current_node->parent; \ + if (current_node->left != NULL) { \ + if (hallocy_free(current_node->left) != HALLOCY_ERROR_NONE) { \ + return FLEDASTY_ERROR_FAILED_ALLOCATION; \ + } \ + \ + current_node->left = NULL; \ + } else { \ + if (hallocy_free(current_node->right) != HALLOCY_ERROR_NONE) { \ + return FLEDASTY_ERROR_FAILED_ALLOCATION; \ + } \ + \ + current_node->right = NULL; \ + } \ + } else { \ + hallocy_free(current_node); \ + current_node = NULL; \ + } \ + } \ + \ + return FLEDASTY_ERROR_NONE; \ +} + #endif diff --git a/Tests/Main.c b/Tests/Main.c index 7eb8af0..b2f03b5 100644 --- a/Tests/Main.c +++ b/Tests/Main.c @@ -60,6 +60,7 @@ FLEDASTY_BINARY_SEARCH_TREE_DEFINE(int, int, int_int) FLEDASTY_BINARY_SEARCH_TREE_IMPLEMENT(int, int, int_int, compare_integers, integer_less_than_integer) FLEDASTY_RED_BLACK_TREE_DEFINE(int, int, int_int) +FLEDASTY_RED_BLACK_TREE_IMPLEMENT(int, int, int_int, compare_integers, integer_less_than_integer) int main() { FledastyQueue_int test_queue = { 0, 0, 0, 0, NULL }; @@ -381,6 +382,10 @@ int main() { printf("Biggest key is %d with the value %d\n", max_key, max_value); fledasty_binary_search_tree_int_int_free(&test_search_tree); + + FledastyRedBlackTree_int_int test_red_black_tree = { 0, NULL }; + + fledasty_red_black_tree_int_int_free(&test_red_black_tree); printf("Done\n"); return 0; } \ No newline at end of file