17 int (*compare
)(const void *key1
, const void *key2
);
18 void (*destroy
)(void *data
);
19 void (*dump
)(const void *data
);
22 static struct bs_tree cep_bs_tree
;
24 static struct node
*bst_node_alloc(void *data
)
28 new = malloc(sizeof(*new));
30 fatal("Could not allocate memory");
33 new->left
= new->right
= NULL
;
38 static struct node
*__bst_insert(void *data
, struct node
*node
)
43 return bst_node_alloc(data
);
45 cmpval
= cep_bs_tree
.compare(data
, node
->data
);
48 node
->left
= __bst_insert(data
, node
->left
);
49 } else if (cmpval
> 0) {
51 node
->right
= __bst_insert(data
, node
->right
);
54 /* we ignore duplicates */
59 static void bst_insert(void *data
)
61 cep_bs_tree
.root
= __bst_insert(data
, cep_bs_tree
.root
);
65 static void *lookup(const void *data
, struct node
*node
)
75 cmpval
= cep_bs_tree
.compare(data
, node
->data
);
77 /* move to the left */
78 ret
= lookup(data
, node
->left
);
79 } else if (cmpval
> 0) {
80 /* move to the right */
81 ret
= lookup(data
, node
->right
);
90 static void *bst_lookup(const void *data
)
92 return lookup(data
, cep_bs_tree
.root
);
95 static void bst_init(int (*compare
)(const void *key1
, const void *key2
),
96 void (*destroy
)(void *data
),
97 void (*dump
)(const void *data
))
100 cep_bs_tree
.size
= 0;
101 cep_bs_tree
.root
= NULL
;
102 cep_bs_tree
.compare
= compare
;
103 cep_bs_tree
.destroy
= destroy
;
104 cep_bs_tree
.dump
= dump
;
107 static size_t bst_size(void)
109 return cep_bs_tree
.size
;
112 static void destroy(struct node
*node
)
118 destroy(node
->right
);
120 cep_bs_tree
.destroy(node
->data
);
124 static void bst_destroy(void)
126 destroy(cep_bs_tree
.root
);
129 static void dump(struct node
*node
)
136 cep_bs_tree
.dump(node
->data
);
141 static void bst_dump(void)
143 dump(cep_bs_tree
.root
);
146 struct module bst_module
= {
147 .mod_name
= "BINARY SEARCH TREE",
148 .mod_init
= bst_init
,
149 .mod_destroy
= bst_destroy
,
150 .mod_insert
= bst_insert
,
151 .mod_lookup
= bst_lookup
,
152 .mod_dump
= bst_dump
,
153 .mod_size
= bst_size
,