status_t _release_tree_chunks(rb_tree_handle_t tree) { status_t status = NO_ERROR; rb_tree_node_handle_t last = NULL; rb_tree_node_handle_t next = NULL; void* chunk = NULL; if (NULL == tree) { return ERR_NULL_POINTER; } status = rb_tree_enumerate( tree, NULL, NULL, last, &next); while ((NO_ERROR == status) && (NULL != next)) { last = next; status = rb_tree_node_key(next, &chunk); if (NO_ERROR != status) { continue; } free(chunk); status = rb_tree_enumerate( tree, NULL, NULL, last, &next); } return status; }
static void print_tree (RBTreeNode* node, int depth) { int* value; int i; if (node == NULL) { return; } print_tree (rb_tree_node_child (node, RB_TREE_NODE_LEFT), depth + 1); for (i = 0; i < depth * 6; ++i) { printf (" "); } value = rb_tree_node_key (node); printf ("%i\n", *value); print_tree (rb_tree_node_child (node, RB_TREE_NODE_RIGHT), depth + 1); }
void test_rb_tree_insert_lookup (void) { RBTree* tree; RBTreeNode* node; int i; int* value; /* Create a tree containing some values. Validate the * tree is consistent at all stages. */ tree = rb_tree_new ( (RBTreeCompareFunc) int_compare); for (i = 0; i < NUM_TEST_VALUES; ++i) { test_array[i] = i; rb_tree_insert (tree, &test_array[i], &test_array[i]); assert (rb_tree_num_entries (tree) == i + 1); validate_tree (tree); } assert (rb_tree_root_node (tree) != NULL); /* Check that all values can be read back again */ for (i = 0; i < NUM_TEST_VALUES; ++i) { node = rb_tree_lookup_node (tree, &i); assert (node != NULL); value = rb_tree_node_key (node); assert (*value == i); value = rb_tree_node_value (node); assert (*value == i); } /* Check that invalid nodes are not found */ i = -1; assert (rb_tree_lookup_node (tree, &i) == NULL); i = NUM_TEST_VALUES + 100; assert (rb_tree_lookup_node (tree, &i) == NULL); rb_tree_free (tree); }