rbtree.c: changed return values in insert/delete.
This commit is contained in:
parent
0fba36440c
commit
6514462cdb
2 changed files with 6 additions and 8 deletions
|
|
@ -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()`::
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
Reference in a new issue