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); }
RBTreeValue rb_tree_lookup(RBTree *tree, RBTreeKey key) { RBTreeNode *node; /* Find the node for this key. */ node = rb_tree_lookup_node(tree, key); if (node == NULL) { return RB_TREE_NULL; } else { return node->value; } }
int rb_tree_remove(RBTree *tree, RBTreeKey key) { RBTreeNode *node; /* Find the node to remove. */ node = rb_tree_lookup_node(tree, key); if (node == NULL) { return 0; } rb_tree_remove_node(tree, node); return 1; }