提交 37975232 编写于 作者: S stevenj

added rb_tree_find_le/gt test

darcs-hash:20070828040349-c8de0-46098c86b9fb26fab2d96ff0c6bf34cd0b973828.gz
上级 ec45c3a7
......@@ -232,7 +232,7 @@ rb_node *rb_tree_find_exact(rb_tree *t, int k)
}
/* find greatest point in subtree p that is <= k */
rb_node *find_le(rb_node *p, int k, rb_tree *t)
static rb_node *find_le(rb_node *p, int k, rb_tree *t)
{
rb_node *nil = &t->nil;
rb_compare compare = t->compare;
......@@ -256,7 +256,7 @@ rb_node *rb_tree_find_le(rb_tree *t, int k)
}
/* find least point in subtree p that is > k */
rb_node *find_gt(rb_node *p, int k, rb_tree *t)
static rb_node *find_gt(rb_node *p, int k, rb_tree *t)
{
rb_node *nil = &t->nil;
rb_compare compare = t->compare;
......
......@@ -37,6 +37,8 @@ extern int rb_tree_insert(rb_tree *t, int k);
extern int rb_tree_check(rb_tree *t);
extern rb_node *rb_tree_find(rb_tree *t, int k);
extern rb_node *rb_tree_find_exact(rb_tree *t, int k);
extern rb_node *rb_tree_find_le(rb_tree *t, int k);
extern rb_node *rb_tree_find_gt(rb_tree *t, int k);
extern rb_node *rb_tree_resort(rb_tree *t, rb_node *n);
extern rb_node *rb_tree_min(rb_tree *t);
extern rb_node *rb_tree_max(rb_tree *t);
......
......@@ -99,8 +99,49 @@ int main(int argc, char **argv)
k[i] = -1 - knew;
}
for (i = 0; i < N; ++i)
if (t.N != N) {
fprintf(stderr, "incorrect N (%d) in tree (vs. %d)\n", t.N, N);
return 1;
}
for (i = 0; i < N; ++i) {
k[i] = -1 - k[i];
/* rescale keys by 100 to add more space between them */
k[i] *= 100;
t.nodes[i].k *= 100;
}
for (i = 0; i < N; ++i) {
int k = rand() % (N * 150) - N*25;
rb_node *le = rb_tree_find_le(&t, k);
rb_node *gt = rb_tree_find_gt(&t, k);
rb_node *n = rb_tree_min(&t);
if (n->k > k) {
if (le) {
fprintf(stderr, "found invalid le %d for %d\n", le->k, k);
return 1;
}
if (gt != n) {
fprintf(stderr, "gt is not first node for k=%d\n", k);
return 1;
}
}
else {
rb_node *succ = n;
do {
n = succ;
succ = rb_tree_succ(&t, n);
} while (succ && succ->k <= k);
if (n != le) {
fprintf("rb_tree_find_le gave wrong result for k=%d\n", k);
return 1;
}
if (succ != gt) {
fprintf("rb_tree_find_gt gave wrong result for k=%d\n", k);
return 1;
}
}
}
for (M = N; M > 0; --M) {
j = rand() % M;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册