mirror of
git://projects.qi-hardware.com/wernermisc.git
synced 2024-11-15 04:24:03 +02:00
qpkg/jrb.c: reordered recolor and single_rotate and removed prototypes
This commit is contained in:
parent
c060b883a9
commit
da7a6feb4b
187
qpkg/jrb.c
187
qpkg/jrb.c
@ -46,11 +46,6 @@ Fax: 865-974-4404
|
|||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include "jrb.h"
|
#include "jrb.h"
|
||||||
|
|
||||||
static void mk_new_int(JRB l, JRB r, JRB p, int il);
|
|
||||||
static JRB lprev(JRB n);
|
|
||||||
static JRB rprev(JRB n);
|
|
||||||
static void recolor(JRB n);
|
|
||||||
static void single_rotate(JRB y, int l);
|
|
||||||
|
|
||||||
#define isred(n) (n->red)
|
#define isred(n) (n->red)
|
||||||
#define isblack(n) (!isred(n))
|
#define isblack(n) (!isred(n))
|
||||||
@ -96,6 +91,97 @@ static void delete_item(JRB item) /* Deletes an arbitrary iterm */
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void single_rotate(JRB y, int l)
|
||||||
|
{
|
||||||
|
int rl = 0 /* for gcc */, ir;
|
||||||
|
JRB x, yp;
|
||||||
|
|
||||||
|
ir = isroot(y);
|
||||||
|
yp = y->parent;
|
||||||
|
if (!ir)
|
||||||
|
rl = isleft(y);
|
||||||
|
|
||||||
|
if (l) {
|
||||||
|
x = y->flink;
|
||||||
|
y->flink = x->blink;
|
||||||
|
setleft(y->flink);
|
||||||
|
y->flink->parent = y;
|
||||||
|
x->blink = y;
|
||||||
|
setright(y);
|
||||||
|
} else {
|
||||||
|
x = y->blink;
|
||||||
|
y->blink = x->flink;
|
||||||
|
setright(y->blink);
|
||||||
|
y->blink->parent = y;
|
||||||
|
x->flink = y;
|
||||||
|
setleft(y);
|
||||||
|
}
|
||||||
|
|
||||||
|
x->parent = yp;
|
||||||
|
y->parent = x;
|
||||||
|
if (ir) {
|
||||||
|
yp->parent = x;
|
||||||
|
setnormal(y);
|
||||||
|
setroot(x);
|
||||||
|
} else {
|
||||||
|
if (rl) {
|
||||||
|
yp->flink = x;
|
||||||
|
setleft(x);
|
||||||
|
} else {
|
||||||
|
yp->blink = x;
|
||||||
|
setright(x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void recolor(JRB n)
|
||||||
|
{
|
||||||
|
JRB p, gp, s;
|
||||||
|
int done = 0;
|
||||||
|
|
||||||
|
while (!done) {
|
||||||
|
if (isroot(n)) {
|
||||||
|
setblack(n);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = n->parent;
|
||||||
|
|
||||||
|
if (isblack(p))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (isroot(p)) {
|
||||||
|
setblack(p);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
gp = p->parent;
|
||||||
|
s = sibling(p);
|
||||||
|
if (isred(s)) {
|
||||||
|
setblack(p);
|
||||||
|
setred(gp);
|
||||||
|
setblack(s);
|
||||||
|
n = gp;
|
||||||
|
} else {
|
||||||
|
done = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* p's sibling is black, p is red, gp is black */
|
||||||
|
|
||||||
|
if ((isleft(n) == 0) == (isleft(p) == 0)) {
|
||||||
|
single_rotate(gp, isleft(n));
|
||||||
|
setblack(p);
|
||||||
|
setred(gp);
|
||||||
|
} else {
|
||||||
|
single_rotate(p, isleft(n));
|
||||||
|
single_rotate(gp, isleft(n));
|
||||||
|
setblack(n);
|
||||||
|
setred(gp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static JRB mk_new_ext(void *key, void *val)
|
static JRB mk_new_ext(void *key, void *val)
|
||||||
{
|
{
|
||||||
JRB new;
|
JRB new;
|
||||||
@ -268,97 +354,6 @@ static JRB jrb_insert_b(JRB n, void *key, void *val)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void recolor(JRB n)
|
|
||||||
{
|
|
||||||
JRB p, gp, s;
|
|
||||||
int done = 0;
|
|
||||||
|
|
||||||
while (!done) {
|
|
||||||
if (isroot(n)) {
|
|
||||||
setblack(n);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
p = n->parent;
|
|
||||||
|
|
||||||
if (isblack(p))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (isroot(p)) {
|
|
||||||
setblack(p);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
gp = p->parent;
|
|
||||||
s = sibling(p);
|
|
||||||
if (isred(s)) {
|
|
||||||
setblack(p);
|
|
||||||
setred(gp);
|
|
||||||
setblack(s);
|
|
||||||
n = gp;
|
|
||||||
} else {
|
|
||||||
done = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* p's sibling is black, p is red, gp is black */
|
|
||||||
|
|
||||||
if ((isleft(n) == 0) == (isleft(p) == 0)) {
|
|
||||||
single_rotate(gp, isleft(n));
|
|
||||||
setblack(p);
|
|
||||||
setred(gp);
|
|
||||||
} else {
|
|
||||||
single_rotate(p, isleft(n));
|
|
||||||
single_rotate(gp, isleft(n));
|
|
||||||
setblack(n);
|
|
||||||
setred(gp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void single_rotate(JRB y, int l)
|
|
||||||
{
|
|
||||||
int rl = 0 /* for gcc */, ir;
|
|
||||||
JRB x, yp;
|
|
||||||
|
|
||||||
ir = isroot(y);
|
|
||||||
yp = y->parent;
|
|
||||||
if (!ir)
|
|
||||||
rl = isleft(y);
|
|
||||||
|
|
||||||
if (l) {
|
|
||||||
x = y->flink;
|
|
||||||
y->flink = x->blink;
|
|
||||||
setleft(y->flink);
|
|
||||||
y->flink->parent = y;
|
|
||||||
x->blink = y;
|
|
||||||
setright(y);
|
|
||||||
} else {
|
|
||||||
x = y->blink;
|
|
||||||
y->blink = x->flink;
|
|
||||||
setright(y->blink);
|
|
||||||
y->blink->parent = y;
|
|
||||||
x->flink = y;
|
|
||||||
setleft(y);
|
|
||||||
}
|
|
||||||
|
|
||||||
x->parent = yp;
|
|
||||||
y->parent = x;
|
|
||||||
if (ir) {
|
|
||||||
yp->parent = x;
|
|
||||||
setnormal(y);
|
|
||||||
setroot(x);
|
|
||||||
} else {
|
|
||||||
if (rl) {
|
|
||||||
yp->flink = x;
|
|
||||||
setleft(x);
|
|
||||||
} else {
|
|
||||||
yp->blink = x;
|
|
||||||
setright(x);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void jrb_delete_node(JRB n)
|
void jrb_delete_node(JRB n)
|
||||||
{
|
{
|
||||||
JRB s, p, gp, x, z;
|
JRB s, p, gp, x, z;
|
||||||
|
Loading…
Reference in New Issue
Block a user