* better
[mascara-docs.git] / lang / C / sorting.and.searching.cormen.algo / src / rbtrmain.txt
blob5cf6ce94fd945524104ad97fbf5ccff871bb3e79
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include "rbtr.h"
5 int compare(void *a, void *b) {
6     return *(int *)a - *(int *)b;
9 int main(int argc, char **argv) {
10     int maxnum, ct;
12     // command-line:
13     //
14     //   rbtmain 2000
15     //       process 2000 records
17     RbtIterator i;
18     RbtHandle h;
19     RbtStatus status;
21     maxnum = atoi(argv[1]);
23     // obtain handle to red-black tree
24     h = rbtNew(compare);
26     printf("maxnum = %d\n", maxnum);
27     for (ct = maxnum; ct; ct--) {
28         int key = rand() % 90 + 1;
30         if ((i = rbtFind(h, &key)) != rbtEnd(h)) {
31             // found an existing node
32             void *keyp, *valuep;
34             // get key-value pointers
35             rbtKeyValue(h, i, &keyp, &valuep);
37             // check to see they contain correct data
38             if (*(int *)keyp != key) printf("fail keyp\n");
39             if (*(int *)valuep != 10*key) printf("fail valuep\n");
41             // erase node in red-black tree
42             status = rbtErase(h, i);
43             if (status) printf("fail: status = %d\n", status);
45             // free the pointers allocated by main
46             free(keyp); free(valuep);
48         } else {
49             // create a new node
50             int *keyp, *valuep;
52             // allocate key/value data
53             keyp = (int *)malloc(sizeof(int));
54             valuep = (int *)malloc(sizeof(int));
56             // initialize with values
57             *keyp = key;
58             *valuep = 10*key;
60             // insert in red-black tree
61             status = rbtInsert(h, keyp, valuep);
62             if (status) printf("fail: status = %d\n", status);
63         }
64     }
66     // output nodes in order
67     for (i = rbtBegin(h); i != rbtEnd(h); i = rbtNext(h, i)) {
68         void *keyp, *valuep;
69         rbtKeyValue(h, i, &keyp, &valuep);
70         printf("%d %d\n", *(int *)keyp, *(int *)valuep);
71     }
73     // delete my allocated memory
74     for (i = rbtBegin(h); i != rbtEnd(h); i = rbtNext(h, i)) {
75         void *keyp, *valuep;
76         rbtKeyValue(h, i, &keyp, &valuep);
77         free(keyp); free(valuep);
78     }
80     // delete red-black tree
81     rbtDelete(h);
83     return 0;