Archived
1
0
Fork 0

rbtree.c: changed return values in insert/delete.

This commit is contained in:
Henrik Hautakoski 2011-01-05 10:17:22 +01:00
parent 0fba36440c
commit 6514462cdb
2 changed files with 6 additions and 8 deletions

View file

@ -68,14 +68,14 @@ Functions
Creates and inserts a new node in the tree. + Creates and inserts a new node in the tree. +
If provided, calls `rbtree->update_fn` and `rbtree->delete_fn` if a node should be updated. + If provided, calls `rbtree->update_fn` and `rbtree->delete_fn` if a node should be updated. +
Returns a nonzero value if a new node was inserted, zero if 'key' already existed and that node was updated. Returns nonzero if a new node was inserted or updated, zero otherwise.
NOTE: The memory pointed to by the 'key' pointer is *not* copied so you must ensure that it has a infinite lifetime. NOTE: The memory pointed to by the 'key' pointer is *not* copied so you must ensure that it has a infinite lifetime.
`rbtree_delete()`:: `rbtree_delete()`::
Deletes a node from the tree. if provided, calls `rbtree->delete_fn` for the node. + Deletes a node from the tree. if provided, calls `rbtree->delete_fn` for the node. +
Returns non zero if a node was removed. zero otherwise. Returns nonzero if a node was removed, zero otherwise.
`rbtree_free()`:: `rbtree_free()`::

View file

@ -133,14 +133,13 @@ int rbtree_insert(rbtree *tree, const void *key) {
/* iterator and parent */ /* iterator and parent */
rbnode *p, *q; rbnode *p, *q;
unsigned char dir = 0, dir2, last, inserted = 0; unsigned char dir = 0, dir2, last;
if (!tree || !tree->cmp_fn) if (!tree || !tree->cmp_fn)
return 0; return 0;
if (tree->root == NULL) { if (tree->root == NULL) {
tree->root = node_alloc(key); tree->root = node_alloc(key);
inserted = 1;
goto done; goto done;
} }
@ -155,7 +154,6 @@ int rbtree_insert(rbtree *tree, const void *key) {
if (q == NULL) { if (q == NULL) {
p->child[dir] = q = node_alloc(key); p->child[dir] = q = node_alloc(key);
inserted = 1;
} else if (is_red(q->child[0]) && is_red(q->child[1])) { } else if (is_red(q->child[0]) && is_red(q->child[1])) {
/* color flip case */ /* color flip case */
q->color = RB_RED; q->color = RB_RED;
@ -186,7 +184,7 @@ int rbtree_insert(rbtree *tree, const void *key) {
q = q->child[dir]; q = q->child[dir];
} }
if (!inserted) { if (q->key != key) {
if (tree->delete_fn) if (tree->delete_fn)
tree->delete_fn((void*)q->key); tree->delete_fn((void*)q->key);
q->key = key; q->key = key;
@ -198,7 +196,7 @@ done:
/* root should be black */ /* root should be black */
tree->root->color = RB_BLACK; tree->root->color = RB_BLACK;
return inserted; return 1;
} }
int rbtree_delete(rbtree *tree, const void *key) { int rbtree_delete(rbtree *tree, const void *key) {