diff options
author | Ingo Huerner <ingo.huerner@xse.de> | 2015-01-22 11:24:12 +0100 |
---|---|---|
committer | Ingo Huerner <ingo.huerner@xse.de> | 2015-01-22 11:24:12 +0100 |
commit | b596d8b27f952ab1bbc049b384c465d2e139e135 (patch) | |
tree | 75aaef2b3229939929eaf55b449b7b387ac83d23 /src/rbtree.c | |
parent | ddccbec6d938dd3b7b8a644d5a191d1f673173a0 (diff) | |
download | persistence-client-library-b596d8b27f952ab1bbc049b384c465d2e139e135.tar.gz |
Minor changes after code review; replaced static arrays for handles by a tree
Diffstat (limited to 'src/rbtree.c')
-rw-r--r-- | src/rbtree.c | 55 |
1 files changed, 34 insertions, 21 deletions
diff --git a/src/rbtree.c b/src/rbtree.c index d3496ed..2b511c7 100644 --- a/src/rbtree.c +++ b/src/rbtree.c @@ -210,10 +210,11 @@ void *jsw_rbfind ( jsw_rbtree_t *tree, void *data ) { jsw_rbnode_t *it = tree->root; - while ( it != NULL ) { - int cmp = tree->cmp( it->data, data ); + while ( it != NULL ) + { + int cmp = tree->cmp( it->data, data); - if ( cmp == 0 ) + if( cmp == 0 ) break; /* @@ -266,22 +267,26 @@ int jsw_rbinsert ( jsw_rbtree_t *tree, void *data ) q = t->link[1] = tree->root; /* Search down the tree for a place to insert */ - for ( ; ; ) { - if ( q == NULL ) { + for ( ; ; ) + { + if ( q == NULL ) + { /* Insert a new node at the first null link */ p->link[dir] = q = new_node ( tree, data ); if ( q == NULL ) return 0; } - else if ( is_red ( q->link[0] ) && is_red ( q->link[1] ) ) { + else if ( is_red ( q->link[0] ) && is_red ( q->link[1] ) ) + { /* Simple red violation: color flip */ q->red = 1; q->link[0]->red = 0; q->link[1]->red = 0; } - if ( is_red ( q ) && is_red ( p ) ) { + if ( is_red ( q ) && is_red ( p ) ) + { /* Hard red violation: rotations necessary */ int dir2 = t->link[1] == g; @@ -325,7 +330,7 @@ int jsw_rbinsert ( jsw_rbtree_t *tree, void *data ) return 1; } -#if 0 + /** <summary> Releases a valid red black tree @@ -366,6 +371,7 @@ void jsw_rbdelete ( jsw_rbtree_t *tree ) } + /** <summary> Remove a node from a red black tree @@ -384,8 +390,9 @@ void jsw_rbdelete ( jsw_rbtree_t *tree ) */ int jsw_rberase ( jsw_rbtree_t *tree, void *data ) { - if ( tree->root != NULL ) { - jsw_rbnode_t head = {0}; /* False tree root */ + if ( tree->root != NULL ) + { + jsw_rbnode_t head = {0, NULL, {NULL, NULL} }; /* False tree root */ jsw_rbnode_t *q, *p, *g; /* Helpers */ jsw_rbnode_t *f = NULL; /* Found item */ int dir = 1; @@ -399,7 +406,8 @@ int jsw_rberase ( jsw_rbtree_t *tree, void *data ) Search and push a red node down to fix red violations as we go */ - while ( q->link[dir] != NULL ) { + while ( q->link[dir] != NULL ) + { int last = dir; /* Move the helpers down */ @@ -415,20 +423,25 @@ int jsw_rberase ( jsw_rbtree_t *tree, void *data ) f = q; /* Push the red node down with rotations and color flips */ - if ( !is_red ( q ) && !is_red ( q->link[dir] ) ) { + if ( !is_red ( q ) && !is_red ( q->link[dir] ) ) + { if ( is_red ( q->link[!dir] ) ) p = p->link[last] = jsw_single ( q, dir ); - else if ( !is_red ( q->link[!dir] ) ) { + else if ( !is_red ( q->link[!dir] ) ) + { jsw_rbnode_t *s = p->link[!last]; - if ( s != NULL ) { - if ( !is_red ( s->link[!last] ) && !is_red ( s->link[last] ) ) { + if ( s != NULL ) + { + if ( !is_red ( s->link[!last] ) && !is_red ( s->link[last] ) ) + { /* Color flip */ p->red = 0; s->red = 1; q->red = 1; } - else { + else + { int dir2 = g->link[1] == p; if ( is_red ( s->link[last] ) ) @@ -447,11 +460,11 @@ int jsw_rberase ( jsw_rbtree_t *tree, void *data ) } /* Replace and remove the saved node */ - if ( f != NULL ) { - tree->rel ( f->data ); + if ( f != NULL ) + { + tree->rel( f->data ); f->data = q->data; - p->link[p->link[1] == q] = - q->link[q->link[0] == NULL]; + p->link[p->link[1] == q] = q->link[q->link[0] == NULL]; free ( q ); } @@ -467,7 +480,7 @@ int jsw_rberase ( jsw_rbtree_t *tree, void *data ) return 1; } - +#if 0 /** <summary> Gets the number of nodes in a red black tree |