|
|
@ -14,7 +14,7 @@ static const int dbg = 0; |
|
|
|
|
|
|
|
|
|
|
|
#define FAIL(fmt, ...) do \ |
|
|
|
#define FAIL(fmt, ...) do \ |
|
|
|
{ \
|
|
|
|
{ \
|
|
|
|
quithere(1, fmt, ##__VA_ARGS__); \
|
|
|
|
quithere(1, fmt KTREE_FFL, ##__VA_ARGS__, KTREE_FFL_PASS); \
|
|
|
|
} while (0); |
|
|
|
} while (0); |
|
|
|
|
|
|
|
|
|
|
|
#define RED_RED true |
|
|
|
#define RED_RED true |
|
|
@ -25,12 +25,12 @@ static const int dbg = 0; |
|
|
|
|
|
|
|
|
|
|
|
static K_TREE nil[1] = { { Yo, RED_BLACK, NULL, NULL, NULL, NULL, 0 } }; |
|
|
|
static K_TREE nil[1] = { { Yo, RED_BLACK, NULL, NULL, NULL, NULL, 0 } }; |
|
|
|
|
|
|
|
|
|
|
|
K_TREE *new_ktree() |
|
|
|
K_TREE *_new_ktree(KTREE_FFL_ARGS) |
|
|
|
{ |
|
|
|
{ |
|
|
|
K_TREE *ktree = (K_TREE *)malloc(sizeof(*ktree)); |
|
|
|
K_TREE *ktree = (K_TREE *)malloc(sizeof(*ktree)); |
|
|
|
|
|
|
|
|
|
|
|
if (ktree == NULL) |
|
|
|
if (ktree == NULL) |
|
|
|
FAIL("%s", "%K_TREE-F-OOM"); |
|
|
|
FAIL("%s", "OOM"); |
|
|
|
|
|
|
|
|
|
|
|
ktree->isNil = Yo; |
|
|
|
ktree->isNil = Yo; |
|
|
|
ktree->red = RED_BLACK; |
|
|
|
ktree->red = RED_BLACK; |
|
|
@ -43,12 +43,12 @@ K_TREE *new_ktree() |
|
|
|
return ktree; |
|
|
|
return ktree; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static K_TREE *new_data(K_ITEM *data) |
|
|
|
static K_TREE *new_data(K_ITEM *data, KTREE_FFL_ARGS) |
|
|
|
{ |
|
|
|
{ |
|
|
|
K_TREE *ktree = (K_TREE *)malloc(sizeof(*ktree)); |
|
|
|
K_TREE *ktree = (K_TREE *)malloc(sizeof(*ktree)); |
|
|
|
|
|
|
|
|
|
|
|
if (ktree == NULL) |
|
|
|
if (ktree == NULL) |
|
|
|
FAIL("%s", "%K_TREE-F-OOM"); |
|
|
|
FAIL("%s", "OOM"); |
|
|
|
|
|
|
|
|
|
|
|
ktree->isNil = No; |
|
|
|
ktree->isNil = No; |
|
|
|
ktree->red = RED_RED; |
|
|
|
ktree->red = RED_RED; |
|
|
@ -109,7 +109,7 @@ static void show_ktree(K_TREE *root, char *path, int pos, char *(*dsp_funct)(K_I |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void dump_ktree(K_TREE *root, char *(*dsp_funct)(K_ITEM *)) |
|
|
|
void _dump_ktree(K_TREE *root, char *(*dsp_funct)(K_ITEM *), KTREE_FFL_ARGS) |
|
|
|
{ |
|
|
|
{ |
|
|
|
char buf[42424]; |
|
|
|
char buf[42424]; |
|
|
|
|
|
|
|
|
|
|
@ -124,7 +124,7 @@ void dump_ktree(K_TREE *root, char *(*dsp_funct)(K_ITEM *)) |
|
|
|
printf(" Empty ktree\n"); |
|
|
|
printf(" Empty ktree\n"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void dsp_ktree(K_LIST *list, K_TREE *root, char *filename) |
|
|
|
void _dsp_ktree(K_LIST *list, K_TREE *root, char *filename, KTREE_FFL_ARGS) |
|
|
|
{ |
|
|
|
{ |
|
|
|
K_TREE_CTX ctx[1]; |
|
|
|
K_TREE_CTX ctx[1]; |
|
|
|
K_ITEM *item; |
|
|
|
K_ITEM *item; |
|
|
@ -167,76 +167,76 @@ void dsp_ktree(K_LIST *list, K_TREE *root, char *filename) |
|
|
|
fclose(stream); |
|
|
|
fclose(stream); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static int nilTest(K_TREE *node, char *msg, int depth, int count, K_TREE *nil2) |
|
|
|
static int nilTest(K_TREE *node, char *msg, int depth, int count, K_TREE *nil2, KTREE_FFL_ARGS) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (node->isNil == Yo || node == nil2) |
|
|
|
if (node->isNil == Yo || node == nil2) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (node == nil2 && node->isNil == No) |
|
|
|
if (node == nil2 && node->isNil == No) |
|
|
|
FAIL("%%K_TREE-F-NIL2NOTNIL '%s' depth=%d count=%d", msg, depth, count); |
|
|
|
FAIL("NIL2NOTNIL '%s' depth=%d count=%d", msg, depth, count); |
|
|
|
|
|
|
|
|
|
|
|
if (node != nil && node != nil2) |
|
|
|
if (node != nil && node != nil2) |
|
|
|
FAIL("%%K_TREE-F-NOTNILNIL2 '%s' depth=%d count=%d", msg, depth, count); |
|
|
|
FAIL("NOTNILNIL2 '%s' depth=%d count=%d", msg, depth, count); |
|
|
|
|
|
|
|
|
|
|
|
if (node->red == RED_RED) |
|
|
|
if (node->red == RED_RED) |
|
|
|
FAIL("%%K_TREE-F-NIRED '%s' depth=%d count=%d", msg, depth, count); |
|
|
|
FAIL("NIRED '%s' depth=%d count=%d", msg, depth, count); |
|
|
|
|
|
|
|
|
|
|
|
if (node != nil2 && node->parent != NULL) |
|
|
|
if (node != nil2 && node->parent != NULL) |
|
|
|
FAIL("%%K_TREE-F-NILPARENT '%s' depth=%d count=%d", msg, depth, count); |
|
|
|
FAIL("NILPARENT '%s' depth=%d count=%d", msg, depth, count); |
|
|
|
|
|
|
|
|
|
|
|
if (node != nil2 && node->left != NULL) |
|
|
|
if (node != nil2 && node->left != NULL) |
|
|
|
FAIL("%%K_TREE-F-NILLEFT '%s' depth=%d count=%d", msg, depth, count); |
|
|
|
FAIL("NILLEFT '%s' depth=%d count=%d", msg, depth, count); |
|
|
|
|
|
|
|
|
|
|
|
if (node == nil2 && node->left != nil) |
|
|
|
if (node == nil2 && node->left != nil) |
|
|
|
FAIL("%%K_TREE-F-NIL2LEFT '%s' depth=%d count=%d", msg, depth, count); |
|
|
|
FAIL("NIL2LEFT '%s' depth=%d count=%d", msg, depth, count); |
|
|
|
|
|
|
|
|
|
|
|
if (node != nil2 && node->right != NULL) |
|
|
|
if (node != nil2 && node->right != NULL) |
|
|
|
FAIL("%%K_TREE-F-NILRIGHT '%s' depth=%d count=%d", msg, depth, count); |
|
|
|
FAIL("NILRIGHT '%s' depth=%d count=%d", msg, depth, count); |
|
|
|
|
|
|
|
|
|
|
|
if (node == nil2 && node->right != nil) |
|
|
|
if (node == nil2 && node->right != nil) |
|
|
|
FAIL("%%K_TREE-F-NIL2RIGHT '%s' depth=%d count=%d", msg, depth, count); |
|
|
|
FAIL("NIL2RIGHT '%s' depth=%d count=%d", msg, depth, count); |
|
|
|
|
|
|
|
|
|
|
|
if (node->data != NULL) |
|
|
|
if (node->data != NULL) |
|
|
|
FAIL("%%K_TREE-F-NIDATA '%s' depth=%d count=%d", msg, depth, count); |
|
|
|
FAIL("NIDATA '%s' depth=%d count=%d", msg, depth, count); |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
|
{ |
|
|
|
{ |
|
|
|
count++; |
|
|
|
count++; |
|
|
|
|
|
|
|
|
|
|
|
if (node->parent == NULL) |
|
|
|
if (node->parent == NULL) |
|
|
|
FAIL("%%K_TREE-F-NOPAR '%s' depth=%d count=%d", msg, depth, count); |
|
|
|
FAIL("NOPAR '%s' depth=%d count=%d", msg, depth, count); |
|
|
|
|
|
|
|
|
|
|
|
if (node->left == NULL) |
|
|
|
if (node->left == NULL) |
|
|
|
FAIL("%%K_TREE-F-NOLEFT '%s' depth=%d count=%d", msg, depth, count); |
|
|
|
FAIL("NOLEFT '%s' depth=%d count=%d", msg, depth, count); |
|
|
|
|
|
|
|
|
|
|
|
if (node->right == NULL) |
|
|
|
if (node->right == NULL) |
|
|
|
FAIL("%%K_TREE-F-NORIGHT '%s' depth=%d count=%d", msg, depth, count); |
|
|
|
FAIL("NORIGHT '%s' depth=%d count=%d", msg, depth, count); |
|
|
|
|
|
|
|
|
|
|
|
if (node->data == NULL) |
|
|
|
if (node->data == NULL) |
|
|
|
FAIL("%%K_TREE-F-NODATA '%s' depth=%d count=%d", msg, depth, count); |
|
|
|
FAIL("NODATA '%s' depth=%d count=%d", msg, depth, count); |
|
|
|
|
|
|
|
|
|
|
|
if (node->test != nilTestValue) |
|
|
|
if (node->test != nilTestValue) |
|
|
|
node->test = nilTestValue; |
|
|
|
node->test = nilTestValue; |
|
|
|
else |
|
|
|
else |
|
|
|
FAIL("%%K_TREE-F-NILTESTVALUE '%s' depth=%d count=%d", msg, depth, count); |
|
|
|
FAIL("NILTESTVALUE '%s' depth=%d count=%d", msg, depth, count); |
|
|
|
|
|
|
|
|
|
|
|
count = nilTest(node->left, msg, depth+1, count, nil2); |
|
|
|
count = nilTest(node->left, msg, depth+1, count, nil2, KTREE_FFL_PASS); |
|
|
|
count = nilTest(node->right, msg, depth+1, count, nil2); |
|
|
|
count = nilTest(node->right, msg, depth+1, count, nil2, KTREE_FFL_PASS); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return(count); |
|
|
|
return(count); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void bTest(K_TREE *root, K_TREE *cur, char *msg, int count) |
|
|
|
static void bTest(K_TREE *root, K_TREE *cur, char *msg, int count, KTREE_FFL_ARGS) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (cur->red != RED_RED) |
|
|
|
if (cur->red != RED_RED) |
|
|
|
count++; |
|
|
|
count++; |
|
|
|
else |
|
|
|
else |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (cur->left->red == RED_RED) |
|
|
|
if (cur->left->red == RED_RED) |
|
|
|
FAIL("%%K_TREE-F-CURLR '%s' count=%d", msg, count); |
|
|
|
FAIL("CURLR '%s' count=%d", msg, count); |
|
|
|
|
|
|
|
|
|
|
|
if (cur->right->red == RED_RED) |
|
|
|
if (cur->right->red == RED_RED) |
|
|
|
FAIL("%%K_TREE-F-CURRR '%s' count=%d", msg, count); |
|
|
|
FAIL("CURRR '%s' count=%d", msg, count); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (cur->isNil == Yo) |
|
|
|
if (cur->isNil == Yo) |
|
|
@ -245,52 +245,52 @@ static void bTest(K_TREE *root, K_TREE *cur, char *msg, int count) |
|
|
|
bCount = count; |
|
|
|
bCount = count; |
|
|
|
|
|
|
|
|
|
|
|
if (count != bCount) |
|
|
|
if (count != bCount) |
|
|
|
FAIL("%%K_TREE-F-BCOUNT '%s' count=%d bCount=%d", msg, count, bCount); |
|
|
|
FAIL("BCOUNT '%s' count=%d bCount=%d", msg, count, bCount); |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (cur->test != bTestValue) |
|
|
|
if (cur->test != bTestValue) |
|
|
|
cur->test = bTestValue; |
|
|
|
cur->test = bTestValue; |
|
|
|
else |
|
|
|
else |
|
|
|
FAIL("%%K_TREE-F-BTESTVALUE '%s' count=%d", msg, count); |
|
|
|
FAIL("BTESTVALUE '%s' count=%d", msg, count); |
|
|
|
|
|
|
|
|
|
|
|
bTest(root, cur->left, msg, count); |
|
|
|
bTest(root, cur->left, msg, count, KTREE_FFL_PASS); |
|
|
|
bTest(root, cur->right, msg, count); |
|
|
|
bTest(root, cur->right, msg, count, KTREE_FFL_PASS); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void bTestInit(K_TREE *root, char *msg) |
|
|
|
static void bTestInit(K_TREE *root, char *msg, KTREE_FFL_ARGS) |
|
|
|
{ |
|
|
|
{ |
|
|
|
bCount = 0; |
|
|
|
bCount = 0; |
|
|
|
bTestValue = getTestValue(); |
|
|
|
bTestValue = getTestValue(); |
|
|
|
bTest(root, root, msg, 0); |
|
|
|
bTest(root, root, msg, 0, KTREE_FFL_PASS); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void lrpTest(K_TREE *top, char *msg) |
|
|
|
static void lrpTest(K_TREE *top, char *msg, KTREE_FFL_ARGS) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (top->test != lrpTestValue) |
|
|
|
if (top->test != lrpTestValue) |
|
|
|
top->test = lrpTestValue; |
|
|
|
top->test = lrpTestValue; |
|
|
|
else |
|
|
|
else |
|
|
|
FAIL("%%K_TREE-F-LRPTESTVALUE '%s'", msg); |
|
|
|
FAIL("LRPTESTVALUE '%s'", msg); |
|
|
|
|
|
|
|
|
|
|
|
if (top->left->isNil == No) |
|
|
|
if (top->left->isNil == No) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (top->left->parent != top) |
|
|
|
if (top->left->parent != top) |
|
|
|
FAIL("%%K_TREE-F-LRPTESTL '%s'", msg); |
|
|
|
FAIL("LRPTESTL '%s'", msg); |
|
|
|
|
|
|
|
|
|
|
|
lrpTest(top->left, msg); |
|
|
|
lrpTest(top->left, msg, KTREE_FFL_PASS); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (top->right->isNil == No) |
|
|
|
if (top->right->isNil == No) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (top->right->parent != top) |
|
|
|
if (top->right->parent != top) |
|
|
|
FAIL("%%K_TREE-F-LRPTESTR '%s'", msg); |
|
|
|
FAIL("LRPTESTR '%s'", msg); |
|
|
|
|
|
|
|
|
|
|
|
lrpTest(top->right, msg); |
|
|
|
lrpTest(top->right, msg, KTREE_FFL_PASS); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static __maybe_unused void check_ktree(K_TREE *root, char *msg, K_TREE *nil2, int debugNil, int debugLRP, int debugColor) |
|
|
|
static __maybe_unused void check_ktree(K_TREE *root, char *msg, K_TREE *nil2, int debugNil, int debugLRP, int debugColor, KTREE_FFL_ARGS) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (root->isNil == Yo) |
|
|
|
if (root->isNil == Yo) |
|
|
|
return; |
|
|
|
return; |
|
|
@ -298,20 +298,20 @@ static __maybe_unused void check_ktree(K_TREE *root, char *msg, K_TREE *nil2, in |
|
|
|
if (debugNil) |
|
|
|
if (debugNil) |
|
|
|
{ |
|
|
|
{ |
|
|
|
nilTestValue = getTestValue(); |
|
|
|
nilTestValue = getTestValue(); |
|
|
|
nilTest(root, msg, 1, 0, nil2); |
|
|
|
nilTest(root, msg, 1, 0, nil2, KTREE_FFL_PASS); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (debugLRP && root->isNil == No) |
|
|
|
if (debugLRP && root->isNil == No) |
|
|
|
{ |
|
|
|
{ |
|
|
|
lrpTestValue = getTestValue(); |
|
|
|
lrpTestValue = getTestValue(); |
|
|
|
lrpTest(root, msg); |
|
|
|
lrpTest(root, msg, KTREE_FFL_PASS); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (debugColor && root->isNil == No) |
|
|
|
if (debugColor && root->isNil == No) |
|
|
|
bTestInit(root, msg); |
|
|
|
bTestInit(root, msg, KTREE_FFL_PASS); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
K_ITEM *first_in_ktree(K_TREE *root, K_TREE_CTX *ctx) |
|
|
|
K_ITEM *_first_in_ktree(K_TREE *root, K_TREE_CTX *ctx, KTREE_FFL_ARGS) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (root->isNil == No) |
|
|
|
if (root->isNil == No) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -326,7 +326,7 @@ K_ITEM *first_in_ktree(K_TREE *root, K_TREE_CTX *ctx) |
|
|
|
return(NULL); |
|
|
|
return(NULL); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
K_ITEM *last_in_ktree(K_TREE *root, K_TREE_CTX *ctx) |
|
|
|
K_ITEM *_last_in_ktree(K_TREE *root, K_TREE_CTX *ctx, KTREE_FFL_ARGS) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (root->isNil == No) |
|
|
|
if (root->isNil == No) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -341,7 +341,7 @@ K_ITEM *last_in_ktree(K_TREE *root, K_TREE_CTX *ctx) |
|
|
|
return(NULL); |
|
|
|
return(NULL); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
K_ITEM *next_in_ktree(K_TREE_CTX *ctx) |
|
|
|
K_ITEM *_next_in_ktree(K_TREE_CTX *ctx, KTREE_FFL_ARGS) |
|
|
|
{ |
|
|
|
{ |
|
|
|
K_TREE *parent; |
|
|
|
K_TREE *parent; |
|
|
|
K_TREE *ktree = (K_TREE *)(*ctx); |
|
|
|
K_TREE *ktree = (K_TREE *)(*ctx); |
|
|
@ -370,7 +370,7 @@ K_ITEM *next_in_ktree(K_TREE_CTX *ctx) |
|
|
|
return(NULL); |
|
|
|
return(NULL); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
K_ITEM *prev_in_ktree(K_TREE_CTX *ctx) |
|
|
|
K_ITEM *_prev_in_ktree(K_TREE_CTX *ctx, KTREE_FFL_ARGS) |
|
|
|
{ |
|
|
|
{ |
|
|
|
K_TREE *parent; |
|
|
|
K_TREE *parent; |
|
|
|
K_TREE *ktree = (K_TREE *)(*ctx); |
|
|
|
K_TREE *ktree = (K_TREE *)(*ctx); |
|
|
@ -453,7 +453,7 @@ static K_TREE *right_rotate(K_TREE *root, K_TREE *about) |
|
|
|
return(root); |
|
|
|
return(root); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
K_TREE *add_to_ktree(K_TREE *root, K_ITEM *data, double (*cmp_funct)(K_ITEM *, K_ITEM *)) |
|
|
|
K_TREE *_add_to_ktree(K_TREE *root, K_ITEM *data, double (*cmp_funct)(K_ITEM *, K_ITEM *), KTREE_FFL_ARGS) |
|
|
|
{ |
|
|
|
{ |
|
|
|
K_TREE *ktree; |
|
|
|
K_TREE *ktree; |
|
|
|
K_TREE *x, *y; |
|
|
|
K_TREE *x, *y; |
|
|
@ -461,14 +461,14 @@ K_TREE *add_to_ktree(K_TREE *root, K_ITEM *data, double (*cmp_funct)(K_ITEM *, K |
|
|
|
double cmp; |
|
|
|
double cmp; |
|
|
|
|
|
|
|
|
|
|
|
if (root == NULL) |
|
|
|
if (root == NULL) |
|
|
|
FAIL("%s", "%K_TREE-F-ADDNULL add ktree is NULL"); |
|
|
|
FAIL("%s", "ADDNULL add ktree is NULL"); |
|
|
|
|
|
|
|
|
|
|
|
//check_ktree(root, ">add", NULL, 1, 1, 1);
|
|
|
|
//check_ktree(root, ">add", NULL, 1, 1, 1, KTREE_FFL_PASS);
|
|
|
|
|
|
|
|
|
|
|
|
if (root->parent != nil && root->parent != NULL) |
|
|
|
if (root->parent != nil && root->parent != NULL) |
|
|
|
FAIL("%s", "%K_TREE-F-ADDROOT add root isn't the root"); |
|
|
|
FAIL("%s", "ADDROOT add root isn't the root"); |
|
|
|
|
|
|
|
|
|
|
|
ktree = new_data(data); |
|
|
|
ktree = new_data(data, KTREE_FFL_PASS); |
|
|
|
|
|
|
|
|
|
|
|
if (root->isNil == Yo) |
|
|
|
if (root->isNil == Yo) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -549,17 +549,17 @@ K_TREE *add_to_ktree(K_TREE *root, K_ITEM *data, double (*cmp_funct)(K_ITEM *, K |
|
|
|
} |
|
|
|
} |
|
|
|
root->red = RED_BLACK; |
|
|
|
root->red = RED_BLACK; |
|
|
|
|
|
|
|
|
|
|
|
//check_ktree(root, "<add", NULL, 1, 1, 1);
|
|
|
|
//check_ktree(root, "<add", NULL, 1, 1, 1, KTREE_FFL_PASS);
|
|
|
|
|
|
|
|
|
|
|
|
return(root); |
|
|
|
return(root); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
K_ITEM *find_in_ktree(K_TREE *ktree, K_ITEM *data, double (*cmp_funct)(K_ITEM *, K_ITEM *), K_TREE_CTX *ctx) |
|
|
|
K_ITEM *_find_in_ktree(K_TREE *ktree, K_ITEM *data, double (*cmp_funct)(K_ITEM *, K_ITEM *), K_TREE_CTX *ctx, KTREE_FFL_ARGS) |
|
|
|
{ |
|
|
|
{ |
|
|
|
double cmp = -1.0; |
|
|
|
double cmp = -1.0; |
|
|
|
|
|
|
|
|
|
|
|
if (ktree == NULL) |
|
|
|
if (ktree == NULL) |
|
|
|
FAIL("%s", "%K_TREE-F-FINDNULL find ktree is NULL"); |
|
|
|
FAIL("%s", "FINDNULL find ktree is NULL"); |
|
|
|
|
|
|
|
|
|
|
|
while (ktree->isNil == No && cmp != 0.0) |
|
|
|
while (ktree->isNil == No && cmp != 0.0) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -584,13 +584,13 @@ K_ITEM *find_in_ktree(K_TREE *ktree, K_ITEM *data, double (*cmp_funct)(K_ITEM *, |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
K_ITEM *find_after_in_ktree(K_TREE *ktree, K_ITEM *data, double (*cmp_funct)(K_ITEM *, K_ITEM *), K_TREE_CTX *ctx) |
|
|
|
K_ITEM *_find_after_in_ktree(K_TREE *ktree, K_ITEM *data, double (*cmp_funct)(K_ITEM *, K_ITEM *), K_TREE_CTX *ctx, KTREE_FFL_ARGS) |
|
|
|
{ |
|
|
|
{ |
|
|
|
K_TREE *old = NULL; |
|
|
|
K_TREE *old = NULL; |
|
|
|
double cmp = -1.0, oldcmp = -1; |
|
|
|
double cmp = -1.0, oldcmp = -1; |
|
|
|
|
|
|
|
|
|
|
|
if (ktree == NULL) |
|
|
|
if (ktree == NULL) |
|
|
|
FAIL("%s", "%K_TREE-F-FINDNULL find_after ktree is NULL"); |
|
|
|
FAIL("%s", "FINDNULL find_after ktree is NULL"); |
|
|
|
|
|
|
|
|
|
|
|
while (ktree->isNil == No && cmp != 0.0) |
|
|
|
while (ktree->isNil == No && cmp != 0.0) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -629,13 +629,13 @@ K_ITEM *find_after_in_ktree(K_TREE *ktree, K_ITEM *data, double (*cmp_funct)(K_I |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
K_ITEM *find_before_in_ktree(K_TREE *ktree, K_ITEM *data, double (*cmp_funct)(K_ITEM *, K_ITEM *), K_TREE_CTX *ctx) |
|
|
|
K_ITEM *_find_before_in_ktree(K_TREE *ktree, K_ITEM *data, double (*cmp_funct)(K_ITEM *, K_ITEM *), K_TREE_CTX *ctx, KTREE_FFL_ARGS) |
|
|
|
{ |
|
|
|
{ |
|
|
|
K_TREE *old = NULL; |
|
|
|
K_TREE *old = NULL; |
|
|
|
double cmp = 1.0, oldcmp = 1; |
|
|
|
double cmp = 1.0, oldcmp = 1; |
|
|
|
|
|
|
|
|
|
|
|
if (ktree == NULL) |
|
|
|
if (ktree == NULL) |
|
|
|
FAIL("%s", "%K_TREE-F-FINDNULL find_before ktree is NULL"); |
|
|
|
FAIL("%s", "FINDNULL find_before ktree is NULL"); |
|
|
|
|
|
|
|
|
|
|
|
while (ktree->isNil == No && cmp != 0.0) |
|
|
|
while (ktree->isNil == No && cmp != 0.0) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -755,7 +755,7 @@ static K_TREE *removeFixup(K_TREE *root, K_TREE *fix) |
|
|
|
|
|
|
|
|
|
|
|
// Does this work OK when you remove the last element in the ktree?
|
|
|
|
// Does this work OK when you remove the last element in the ktree?
|
|
|
|
// It should return the root as 'nil'
|
|
|
|
// It should return the root as 'nil'
|
|
|
|
K_TREE *remove_from_ktree(K_TREE *root, K_ITEM *data, double (*cmp_funct)(K_ITEM *, K_ITEM *), K_TREE_CTX *ctx) |
|
|
|
K_TREE *_remove_from_ktree(K_TREE *root, K_ITEM *data, double (*cmp_funct)(K_ITEM *, K_ITEM *), K_TREE_CTX *ctx, KTREE_FFL_ARGS) |
|
|
|
{ |
|
|
|
{ |
|
|
|
K_TREE_CTX tmpctx[1]; |
|
|
|
K_TREE_CTX tmpctx[1]; |
|
|
|
K_TREE *found; |
|
|
|
K_TREE *found; |
|
|
@ -764,10 +764,10 @@ K_TREE *remove_from_ktree(K_TREE *root, K_ITEM *data, double (*cmp_funct)(K_ITEM |
|
|
|
// double cmp;
|
|
|
|
// double cmp;
|
|
|
|
int yred; |
|
|
|
int yred; |
|
|
|
|
|
|
|
|
|
|
|
//check_ktree(root, ">remove", NULL, 1, 1, 1);
|
|
|
|
//check_ktree(root, ">remove", NULL, 1, 1, 1, KTREE_FFL_PASS);
|
|
|
|
|
|
|
|
|
|
|
|
if (root == NULL) |
|
|
|
if (root == NULL) |
|
|
|
FAIL("%s", "%K_TREE-F-REMNULL remove ktree is NULL"); |
|
|
|
FAIL("%s", "REMNULL remove ktree is NULL"); |
|
|
|
|
|
|
|
|
|
|
|
if (root->isNil == Yo) |
|
|
|
if (root->isNil == Yo) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -776,7 +776,7 @@ K_TREE *remove_from_ktree(K_TREE *root, K_ITEM *data, double (*cmp_funct)(K_ITEM |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (root->parent->isNil == No) |
|
|
|
if (root->parent->isNil == No) |
|
|
|
FAIL("%s", "%K_TREE-F-REMROOT remove root isn't the root"); |
|
|
|
FAIL("%s", "REMROOT remove root isn't the root"); |
|
|
|
|
|
|
|
|
|
|
|
fdata = find_in_ktree(root, data, cmp_funct, ctx); |
|
|
|
fdata = find_in_ktree(root, data, cmp_funct, ctx); |
|
|
|
|
|
|
|
|
|
|
@ -784,7 +784,7 @@ K_TREE *remove_from_ktree(K_TREE *root, K_ITEM *data, double (*cmp_funct)(K_ITEM |
|
|
|
return(root); |
|
|
|
return(root); |
|
|
|
|
|
|
|
|
|
|
|
if (cmp_funct(fdata, data) != 0.0) |
|
|
|
if (cmp_funct(fdata, data) != 0.0) |
|
|
|
FAIL("%s", "%K_TREE-F-BADFIND cmp(found, remove) != 0"); |
|
|
|
FAIL("%s", "BADFIND cmp(found, remove) != 0"); |
|
|
|
|
|
|
|
|
|
|
|
found = *ctx; |
|
|
|
found = *ctx; |
|
|
|
|
|
|
|
|
|
|
@ -803,7 +803,7 @@ K_TREE *remove_from_ktree(K_TREE *root, K_ITEM *data, double (*cmp_funct)(K_ITEM |
|
|
|
yred = y->red; |
|
|
|
yred = y->red; |
|
|
|
|
|
|
|
|
|
|
|
if (y->left->isNil == No && y->right->isNil == No) |
|
|
|
if (y->left->isNil == No && y->right->isNil == No) |
|
|
|
FAIL("%s", "%K_TREE-F-REMBADY remove error"); |
|
|
|
FAIL("%s", "REMBADY remove error"); |
|
|
|
|
|
|
|
|
|
|
|
if (y->left->isNil == Yo) |
|
|
|
if (y->left->isNil == Yo) |
|
|
|
x = y->right; |
|
|
|
x = y->right; |
|
|
@ -933,7 +933,7 @@ DBG("@remove after balance=%f :(\n", cmp); |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//check_ktree(root, "<remove", NULL, 1, 1, 1);
|
|
|
|
//check_ktree(root, "<remove", NULL, 1, 1, 1, KTREE_FFL_PASS);
|
|
|
|
|
|
|
|
|
|
|
|
return root; |
|
|
|
return root; |
|
|
|
} |
|
|
|
} |
|
|
@ -952,13 +952,13 @@ static void free_ktree_sub(K_TREE *ktree, void (*free_funct)(void *)) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
K_TREE *free_ktree(K_TREE *ktree, void (*free_funct)(void *)) |
|
|
|
K_TREE *_free_ktree(K_TREE *ktree, void (*free_funct)(void *), KTREE_FFL_ARGS) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (ktree == NULL) |
|
|
|
if (ktree == NULL) |
|
|
|
FAIL("%s", "%K_TREE-F-FREENULL free NULL ktree"); |
|
|
|
FAIL("%s", "FREENULL free NULL ktree"); |
|
|
|
|
|
|
|
|
|
|
|
if (ktree->parent != NULL && ktree->parent != nil) |
|
|
|
if (ktree->parent != NULL && ktree->parent != nil) |
|
|
|
FAIL("%s", "%K_TREE-F-FREENOTROOT free ktree not root"); |
|
|
|
FAIL("%s", "FREENOTROOT free ktree not root"); |
|
|
|
|
|
|
|
|
|
|
|
free_ktree_sub(ktree, free_funct); |
|
|
|
free_ktree_sub(ktree, free_funct); |
|
|
|
|
|
|
|
|
|
|
|