mirror of
git://projects.qi-hardware.com/wernermisc.git
synced 2024-11-22 14:53:09 +02:00
qpkg: simplify jrb_delete_node and more whitespace cleanup
- jrb.c (recolor, jrb_delete_node, jrb_nblack, jrb_free_tree): add space to while(... - jrb.c (jrb_delete_node): flatten deletion of internal node - rbtest.c (main): add test of jrb_delete_node
This commit is contained in:
parent
5a422a470d
commit
a463773c12
85
qpkg/jrb.c
85
qpkg/jrb.c
@ -272,7 +272,7 @@ static void recolor(JRB n)
|
|||||||
JRB p, gp, s;
|
JRB p, gp, s;
|
||||||
int done = 0;
|
int done = 0;
|
||||||
|
|
||||||
while(!done) {
|
while (!done) {
|
||||||
if (isroot(n)) {
|
if (isroot(n)) {
|
||||||
setblack(n);
|
setblack(n);
|
||||||
return;
|
return;
|
||||||
@ -360,8 +360,8 @@ static void single_rotate(JRB y, int l)
|
|||||||
|
|
||||||
void jrb_delete_node(JRB n)
|
void jrb_delete_node(JRB n)
|
||||||
{
|
{
|
||||||
JRB s, p, gp;
|
JRB s, p, gp, x, z;
|
||||||
char ir;
|
char ir, il;
|
||||||
|
|
||||||
if (isint(n)) {
|
if (isint(n)) {
|
||||||
fprintf(stderr, "Cannot delete an internal node: %p\n", n);
|
fprintf(stderr, "Cannot delete an internal node: %p\n", n);
|
||||||
@ -430,7 +430,7 @@ void jrb_delete_node(JRB n)
|
|||||||
n = s;
|
n = s;
|
||||||
p = n->parent;
|
p = n->parent;
|
||||||
s = sibling(n);
|
s = sibling(n);
|
||||||
while(isblack(p) && isblack(s) && isint(s) &&
|
while (isblack(p) && isblack(s) && isint(s) &&
|
||||||
isblack(s->flink) && isblack(s->blink)) {
|
isblack(s->flink) && isblack(s->blink)) {
|
||||||
setred(s);
|
setred(s);
|
||||||
n = p;
|
n = p;
|
||||||
@ -447,49 +447,46 @@ void jrb_delete_node(JRB n)
|
|||||||
s = sibling(n);
|
s = sibling(n);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
if (isext(s)) {
|
||||||
JRB x, z; char il;
|
fprintf(stderr, "DELETION ERROR: sibling not internal\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
if (isext(s)) {
|
il = isleft(n);
|
||||||
|
x = il ? s->flink : s->blink;
|
||||||
|
z = sibling(x);
|
||||||
|
|
||||||
|
if (isred(z)) { /* Rotation 2.3f */
|
||||||
|
single_rotate(p, !il);
|
||||||
|
setblack(z);
|
||||||
|
if (isred(p))
|
||||||
|
setred(s);
|
||||||
|
else
|
||||||
|
setblack(s);
|
||||||
|
setblack(p);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (isblack(x)) { /* Recoloring only (2.3c) */
|
||||||
|
if (isred(s) || isblack(p)) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"DELETION ERROR: sibling not internal\n");
|
"DELETION ERROR: 2.3c not quite right\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
setblack(p);
|
||||||
il = isleft(n);
|
setred(s);
|
||||||
x = il ? s->flink : s->blink;
|
return;
|
||||||
z = sibling(x);
|
|
||||||
|
|
||||||
if (isred(z)) { /* Rotation 2.3f */
|
|
||||||
single_rotate(p, !il);
|
|
||||||
setblack(z);
|
|
||||||
if (isred(p))
|
|
||||||
setred(s);
|
|
||||||
else
|
|
||||||
setblack(s);
|
|
||||||
setblack(p);
|
|
||||||
} else if (isblack(x)) { /* Recoloring only (2.3c) */
|
|
||||||
if (isred(s) || isblack(p)) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"DELETION ERROR: 2.3c not quite right\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
setblack(p);
|
|
||||||
setred(s);
|
|
||||||
return;
|
|
||||||
} else if (isred(p)) { /* 2.3d */
|
|
||||||
single_rotate(s, il);
|
|
||||||
single_rotate(p, !il);
|
|
||||||
setblack(x);
|
|
||||||
setred(s);
|
|
||||||
return;
|
|
||||||
} else { /* 2.3e */
|
|
||||||
single_rotate(s, il);
|
|
||||||
single_rotate(p, !il);
|
|
||||||
setblack(x);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if (isred(p)) { /* 2.3d */
|
||||||
|
single_rotate(s, il);
|
||||||
|
single_rotate(p, !il);
|
||||||
|
setblack(x);
|
||||||
|
setred(s);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* 2.3e */
|
||||||
|
single_rotate(s, il);
|
||||||
|
single_rotate(p, !il);
|
||||||
|
setblack(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -503,7 +500,7 @@ int jrb_nblack(JRB n)
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
nb = 0;
|
nb = 0;
|
||||||
while(!ishead(n)) {
|
while (!ishead(n)) {
|
||||||
if (isblack(n)) nb++;
|
if (isblack(n)) nb++;
|
||||||
n = n->parent;
|
n = n->parent;
|
||||||
}
|
}
|
||||||
@ -537,7 +534,7 @@ void jrb_free_tree(JRB n)
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
while(jrb_first(n) != jrb_nil(n))
|
while (jrb_first(n) != jrb_nil(n))
|
||||||
jrb_delete_node(jrb_first(n));
|
jrb_delete_node(jrb_first(n));
|
||||||
|
|
||||||
free(n);
|
free(n);
|
||||||
|
@ -21,6 +21,7 @@ int main(void)
|
|||||||
JRB p;
|
JRB p;
|
||||||
|
|
||||||
INSERT("ab", "have");
|
INSERT("ab", "have");
|
||||||
|
INSERT("ac", "NOT");
|
||||||
INSERT("d", "little");
|
INSERT("d", "little");
|
||||||
INSERT("c", "this");
|
INSERT("c", "this");
|
||||||
INSERT("b", "passed");
|
INSERT("b", "passed");
|
||||||
@ -29,6 +30,9 @@ int main(void)
|
|||||||
INSERT("aa", "We");
|
INSERT("aa", "We");
|
||||||
INSERT("ff", "!");
|
INSERT("ff", "!");
|
||||||
|
|
||||||
|
p = jrb_find(tree, "ac", cmp);
|
||||||
|
jrb_delete_node(p);
|
||||||
|
|
||||||
jrb_traverse(p, tree)
|
jrb_traverse(p, tree)
|
||||||
printf("%s ", (char *) jrb_val(p));
|
printf("%s ", (char *) jrb_val(p));
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
Loading…
Reference in New Issue
Block a user