chiark / gitweb /
added rb_tree_find_le/gt test
authorstevenj <stevenj@alum.mit.edu>
Tue, 28 Aug 2007 04:03:49 +0000 (00:03 -0400)
committerstevenj <stevenj@alum.mit.edu>
Tue, 28 Aug 2007 04:03:49 +0000 (00:03 -0400)
darcs-hash:20070828040349-c8de0-46098c86b9fb26fab2d96ff0c6bf34cd0b973828.gz

cdirect/redblack.c
cdirect/redblack.h
cdirect/redblack_test.c

index 3001486e8c0d621155af5d6624b6cab164a698d0..da0e5c86930baa570ffc44ceb7709f43a6bedac2 100644 (file)
@@ -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;
index 6aa0831a81d313c63d8841d8c7cde185ce90e9c7..fdc507a806065a720121618a96495dd76cb0a4ac 100644 (file)
@@ -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);
index 7aa1757bc1c36c8c02fe13aa950b125957f00cb6..aaf2c5f3fb44349b28c5f8abaf2097c6a56188a0 100644 (file)
@@ -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;