Skip to content

Commit cdcf400

Browse files
committed
(#8) Add more tree examples and some fixes
1 parent 50b49a7 commit cdcf400

40 files changed

+3230
-3062
lines changed

c_implementation/avl.c

Lines changed: 68 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -2,66 +2,76 @@
22
#include "avl_impl.h"
33
#include <string.h>
44

5-
DataQueryKeyAvlNode* avl_insert(DataQueryKeyAvlNode* tree_root, DataQueryKey elem, DataQueryKeyAvlNode* allocMem,
6-
int (*comp)(const void*, const void*)
7-
) {
8-
DataQueryKeyAvlNode fakeNode;
9-
memset(&fakeNode, 0, sizeof(DataQueryKeyAvlNode));
10-
fakeNode.value = elem;
11-
return avl_insert_impl(tree_root, &fakeNode, allocMem, sizeof(DataQueryKeyAvlNode), comp, offsetof(DataQueryKeyAvlNode, left),
12-
offsetof(DataQueryKeyAvlNode, right), offsetof(DataQueryKeyAvlNode, ht));
13-
}
5+
DataQueryKeyAvlNode *avl_insert(DataQueryKeyAvlNode *tree_root,
6+
DataQueryKey elem,
7+
DataQueryKeyAvlNode *allocMem,
8+
int (*comp)(const void *, const void *)) {
9+
DataQueryKeyAvlNode fakeNode;
10+
memset(&fakeNode, 0, sizeof(DataQueryKeyAvlNode));
11+
fakeNode.value = elem;
12+
return avl_insert_impl(
13+
tree_root, &fakeNode, allocMem, sizeof(DataQueryKeyAvlNode), comp,
14+
offsetof(DataQueryKeyAvlNode, left), offsetof(DataQueryKeyAvlNode, right),
15+
offsetof(DataQueryKeyAvlNode, ht));
16+
}
1417

18+
DataQueryKeyAvlNode *avl_delete_value(DataQueryKeyAvlNode *tree_root,
19+
DataQueryKey valueElem,
20+
int (*comp)(const void *, const void *)) {
21+
DataQueryKeyAvlNode fakeNode;
22+
memset(&fakeNode, 0, sizeof(DataQueryKeyAvlNode));
23+
fakeNode.value = valueElem;
24+
return avl_erase_by_value_impl(
25+
tree_root, &fakeNode, sizeof(DataQueryKeyAvlNode), comp,
26+
offsetof(DataQueryKeyAvlNode, left), offsetof(DataQueryKeyAvlNode, right),
27+
offsetof(DataQueryKeyAvlNode, ht));
28+
}
1529

16-
DataQueryKeyAvlNode* avl_delete_value(DataQueryKeyAvlNode* tree_root, DataQueryKey valueElem,
17-
int (*comp)( const void*, const void*)) {
18-
DataQueryKeyAvlNode fakeNode;
19-
memset(&fakeNode, 0, sizeof(DataQueryKeyAvlNode));
20-
fakeNode.value = valueElem;
21-
return avl_erase_by_value_impl(tree_root, &fakeNode, sizeof(DataQueryKeyAvlNode), comp, offsetof(DataQueryKeyAvlNode, left),
22-
offsetof(DataQueryKeyAvlNode, right), offsetof(DataQueryKeyAvlNode, ht));
23-
}
30+
DataQueryKeyAvlNode *avl_find(DataQueryKeyAvlNode *tree_root,
31+
DataQueryKey valueElem,
32+
int (*comp)(const void *, const void *)) {
33+
DataQueryKeyAvlNode fakeNode;
34+
memset(&fakeNode, 0, sizeof(DataQueryKeyAvlNode));
35+
fakeNode.value = valueElem;
36+
return avl_find_impl(tree_root, comp, &fakeNode,
37+
offsetof(DataQueryKeyAvlNode, left),
38+
offsetof(DataQueryKeyAvlNode, right));
39+
}
2440

25-
DataQueryKeyAvlNode* avl_find(DataQueryKeyAvlNode* tree_root, DataQueryKey valueElem,
26-
int (*comp)( const void*, const void*)){
27-
DataQueryKeyAvlNode fakeNode;
28-
memset(&fakeNode, 0, sizeof(DataQueryKeyAvlNode));
29-
fakeNode.value = valueElem;
30-
return avl_find_impl(tree_root,comp, &fakeNode, offsetof(DataQueryKeyAvlNode, left),
31-
offsetof(DataQueryKeyAvlNode, right));
32-
}
41+
DataQueryKeyAvlNode2 *avl_insert2(DataQueryKeyAvlNode2 *tree_root,
42+
DataQueryKey elem,
43+
DataQueryKeyAvlNode2 *allocMem,
44+
int (*comp)(const void *, const void *)) {
45+
DataQueryKeyAvlNode2 fakeNode;
46+
memset(&fakeNode, 0, sizeof(DataQueryKeyAvlNode2));
47+
fakeNode.value = elem;
48+
return avl_insert_impl(tree_root, &fakeNode, allocMem,
49+
sizeof(DataQueryKeyAvlNode2), comp,
50+
offsetof(DataQueryKeyAvlNode2, left),
51+
offsetof(DataQueryKeyAvlNode2, right),
52+
offsetof(DataQueryKeyAvlNode2, ht));
53+
}
3354

55+
DataQueryKeyAvlNode2 *
56+
avl_delete_value2(DataQueryKeyAvlNode2 *tree_root, DataQueryKey elem,
57+
int (*comp)(const void *, const void *)) {
58+
DataQueryKeyAvlNode2 fakeNode;
59+
memset(&fakeNode, 0, sizeof(DataQueryKeyAvlNode2));
60+
fakeNode.value = elem;
61+
return avl_erase_by_value_impl(tree_root, &fakeNode,
62+
sizeof(DataQueryKeyAvlNode2), comp,
63+
offsetof(DataQueryKeyAvlNode2, left),
64+
offsetof(DataQueryKeyAvlNode2, right),
65+
offsetof(DataQueryKeyAvlNode2, ht));
66+
}
3467

35-
36-
37-
38-
DataQueryKeyAvlNode2* avl_insert2(DataQueryKeyAvlNode2* tree_root, DataQueryKey elem, DataQueryKeyAvlNode2* allocMem,
39-
int (*comp)(const void*, const void*)
40-
) {
41-
DataQueryKeyAvlNode2 fakeNode;
42-
memset(&fakeNode, 0, sizeof(DataQueryKeyAvlNode2));
43-
fakeNode.value = elem;
44-
return avl_insert_impl(tree_root, &fakeNode, allocMem, sizeof(DataQueryKeyAvlNode2), comp,
45-
offsetof(DataQueryKeyAvlNode2, left),
46-
offsetof(DataQueryKeyAvlNode2, right), offsetof(DataQueryKeyAvlNode2, ht));
47-
}
48-
49-
50-
DataQueryKeyAvlNode2* avl_delete_value2(DataQueryKeyAvlNode2* tree_root, DataQueryKey elem,
51-
int (*comp)( const void*, const void*)) {
52-
DataQueryKeyAvlNode2 fakeNode;
53-
memset(&fakeNode, 0, sizeof(DataQueryKeyAvlNode2));
54-
fakeNode.value = elem;
55-
return avl_erase_by_value_impl(tree_root, &fakeNode, sizeof(DataQueryKeyAvlNode2), comp,
56-
offsetof(DataQueryKeyAvlNode2, left),
57-
offsetof(DataQueryKeyAvlNode2, right), offsetof(DataQueryKeyAvlNode2, ht));
58-
}
59-
60-
DataQueryKeyAvlNode2* avl_find2(DataQueryKeyAvlNode2* tree_root, DataQueryKey elem,
61-
int (*comp)( const void*, const void*)){
62-
DataQueryKeyAvlNode2 fakeNode;
63-
memset(&fakeNode, 0, sizeof(DataQueryKeyAvlNode2));
64-
fakeNode.value = elem;
65-
return avl_find_impl(tree_root,comp, &fakeNode, offsetof(DataQueryKeyAvlNode2, left),
66-
offsetof(DataQueryKeyAvlNode2, right));
67-
}
68+
DataQueryKeyAvlNode2 *avl_find2(DataQueryKeyAvlNode2 *tree_root,
69+
DataQueryKey elem,
70+
int (*comp)(const void *, const void *)) {
71+
DataQueryKeyAvlNode2 fakeNode;
72+
memset(&fakeNode, 0, sizeof(DataQueryKeyAvlNode2));
73+
fakeNode.value = elem;
74+
return avl_find_impl(tree_root, comp, &fakeNode,
75+
offsetof(DataQueryKeyAvlNode2, left),
76+
offsetof(DataQueryKeyAvlNode2, right));
77+
}

c_implementation/avl.h

Lines changed: 33 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -8,50 +8,53 @@
88

99
/* AVL of data query keys */
1010
typedef struct DataQueryKeyAvlNode_ {
11-
DataQueryKey value;
12-
size_t nr;
13-
struct DataQueryKeyAvlNode_* parent_optional;
11+
DataQueryKey value;
12+
size_t nr;
13+
struct DataQueryKeyAvlNode_ *parent_optional;
1414

15-
struct DataQueryKeyAvlNode_* left;
16-
struct DataQueryKeyAvlNode_* right;
17-
size_t ht;
15+
struct DataQueryKeyAvlNode_ *left;
16+
struct DataQueryKeyAvlNode_ *right;
17+
size_t ht;
1818

1919
} DataQueryKeyAvlNode;
2020

2121
/* AVL of AVLs */
2222
typedef struct DataQueryKeyAvlNode2_ {
23-
DataQueryKey value;
24-
DataQueryKeyAvlNode* subavl;
25-
size_t nr;
26-
struct DataQueryKeyAvlNode2_* parent_optional;
23+
DataQueryKey value;
24+
DataQueryKeyAvlNode *subavl;
25+
size_t nr;
26+
struct DataQueryKeyAvlNode2_ *parent_optional;
2727

28-
struct DataQueryKeyAvlNode2_* left;
29-
struct DataQueryKeyAvlNode2_* right;
30-
size_t ht;
28+
struct DataQueryKeyAvlNode2_ *left;
29+
struct DataQueryKeyAvlNode2_ *right;
30+
size_t ht;
3131

3232
} DataQueryKeyAvlNode2;
3333

34-
DataQueryKeyAvlNode* avl_insert(DataQueryKeyAvlNode* tree_root, DataQueryKey elem, DataQueryKeyAvlNode* allocMem,
35-
int (*comp)( const void*, const void*)
36-
);
34+
DataQueryKeyAvlNode *avl_insert(DataQueryKeyAvlNode *tree_root,
35+
DataQueryKey elem,
36+
DataQueryKeyAvlNode *allocMem,
37+
int (*comp)(const void *, const void *));
3738

38-
DataQueryKeyAvlNode* avl_delete_value(DataQueryKeyAvlNode* tree_root, DataQueryKey valueElem,
39-
int (*comp)( const void*, const void*));
39+
DataQueryKeyAvlNode *avl_delete_value(DataQueryKeyAvlNode *tree_root,
40+
DataQueryKey valueElem,
41+
int (*comp)(const void *, const void *));
4042

41-
DataQueryKeyAvlNode* avl_find(DataQueryKeyAvlNode* tree_root, DataQueryKey valueElem,
42-
int (*comp)( const void*, const void*));
43+
DataQueryKeyAvlNode *avl_find(DataQueryKeyAvlNode *tree_root,
44+
DataQueryKey valueElem,
45+
int (*comp)(const void *, const void *));
4346

47+
DataQueryKeyAvlNode2 *avl_insert2(DataQueryKeyAvlNode2 *tree_root,
48+
DataQueryKey elem,
49+
DataQueryKeyAvlNode2 *allocMem,
50+
int (*comp)(const void *, const void *));
4451

52+
DataQueryKeyAvlNode2 *
53+
avl_delete_value2(DataQueryKeyAvlNode2 *tree_root, DataQueryKey elem,
54+
int (*comp)(const void *, const void *));
4555

46-
47-
DataQueryKeyAvlNode2* avl_insert2(DataQueryKeyAvlNode2* tree_root, DataQueryKey elem, DataQueryKeyAvlNode2* allocMem,
48-
int (*comp)( const void*, const void*)
49-
);
50-
51-
DataQueryKeyAvlNode2* avl_delete_value2(DataQueryKeyAvlNode2* tree_root, DataQueryKey elem,
52-
int (*comp)( const void*, const void*));
53-
54-
DataQueryKeyAvlNode2* avl_find2(DataQueryKeyAvlNode2* tree_root, DataQueryKey elem,
55-
int (*comp)( const void*, const void*));
56+
DataQueryKeyAvlNode2 *avl_find2(DataQueryKeyAvlNode2 *tree_root,
57+
DataQueryKey elem,
58+
int (*comp)(const void *, const void *));
5659

5760
#endif

c_implementation/avl_impl.c

Lines changed: 42 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
#include "avl_impl.h"
2-
#include <stdlib.h>
3-
#include <stdint.h>
4-
#include <string.h>
52
#include <assert.h>
3+
#include <stdint.h>
64
#include <stdio.h>
5+
#include <stdlib.h>
6+
#include <string.h>
77

88
static size_t avl_height(const void *tree_root, size_t loft, size_t roft,
9-
size_t hoft) {
9+
size_t hoft) {
1010
size_t lh, rh;
1111

1212
if (!tree_root)
@@ -51,7 +51,8 @@ static void *avl_rotateleft(void *x, size_t loft, size_t roft, size_t hoft) {
5151
return y;
5252
}
5353

54-
static int_fast64_t avl_BF(void *tree_root, size_t loft, size_t roft, size_t hoft) {
54+
static int_fast64_t avl_BF(void *tree_root, size_t loft, size_t roft,
55+
size_t hoft) {
5556
int_fast64_t lh, rh;
5657
if (!tree_root)
5758
return 0;
@@ -87,22 +88,21 @@ static void *avl_RL(void *tree_root, size_t loft, size_t roft, size_t hoft) {
8788
return tree_root;
8889
}
8990

90-
static void tree_assert(void*tree_root, size_t loft,
91-
size_t roft) {
91+
static void tree_assert(void *tree_root, size_t loft, size_t roft) {
9292
assert(tree_root);
93-
assert(*(void**)(tree_root+loft) != tree_root);
94-
assert(*(void**)(tree_root+roft) != tree_root);
93+
assert(*(void **)(tree_root + loft) != tree_root);
94+
assert(*(void **)(tree_root + roft) != tree_root);
9595

96-
if (*(void**)(tree_root+loft))
97-
tree_assert(*(void**)(tree_root+loft), loft, roft);
96+
if (*(void **)(tree_root + loft))
97+
tree_assert(*(void **)(tree_root + loft), loft, roft);
9898

99-
if (*(void**)(tree_root+roft))
100-
tree_assert(*(void**)(tree_root+roft), loft, roft);
99+
if (*(void **)(tree_root + roft))
100+
tree_assert(*(void **)(tree_root + roft), loft, roft);
101101
}
102102

103-
void *avl_insert_impl(void*tree_root, void *elem, void *allocMem, size_t node_size,
104-
int (*comp)(const void *, const void *), size_t loft,
105-
size_t roft, size_t hoft) {
103+
void *avl_insert_impl(void *tree_root, void *elem, void *allocMem,
104+
size_t node_size, int (*comp)(const void *, const void *),
105+
size_t loft, size_t roft, size_t hoft) {
106106

107107
if (tree_root == NULL) {
108108
tree_root = allocMem;
@@ -113,7 +113,7 @@ void *avl_insert_impl(void*tree_root, void *elem, void *allocMem, size_t node_si
113113
/* right */
114114
*(void **)(tree_root + roft) =
115115
avl_insert_impl(*(void **)(tree_root + roft), elem, allocMem, node_size,
116-
comp, loft, roft, hoft);
116+
comp, loft, roft, hoft);
117117
if (avl_BF(tree_root, loft, roft, hoft) == -2) {
118118
if (comp(elem, *(void **)(tree_root + roft)) > 0) {
119119
tree_root = avl_RR(tree_root, loft, roft, hoft);
@@ -125,7 +125,7 @@ void *avl_insert_impl(void*tree_root, void *elem, void *allocMem, size_t node_si
125125
/* left */
126126
*(void **)(tree_root + loft) =
127127
avl_insert_impl(*(void **)(tree_root + loft), elem, allocMem, node_size,
128-
comp, loft, roft, hoft);
128+
comp, loft, roft, hoft);
129129
if (avl_BF(tree_root, loft, roft, hoft) == 2) {
130130
if (comp(elem, *(void **)(tree_root + loft)) < 0) {
131131
tree_root = avl_LL(tree_root, loft, roft, hoft);
@@ -142,8 +142,8 @@ void *avl_insert_impl(void*tree_root, void *elem, void *allocMem, size_t node_si
142142
}
143143

144144
void *avl_erase_by_value_impl(void *tree_root, void *elem, size_t node_size,
145-
int (*comp)(const void *, const void *), size_t loft,
146-
size_t roft, size_t hoft) {
145+
int (*comp)(const void *, const void *),
146+
size_t loft, size_t roft, size_t hoft) {
147147
void *p;
148148
if (tree_root == NULL)
149149
return NULL;
@@ -202,33 +202,33 @@ void *avl_erase_by_value_impl(void *tree_root, void *elem, size_t node_size,
202202
return tree_root;
203203
}
204204

205-
void* avl_find_impl(void * root, int (*comp)(const void*, const void*), void* elem, size_t left_offset, size_t right_offset) {
206-
for (;;) {
205+
void *avl_find_impl(void *root, int (*comp)(const void *, const void *),
206+
void *elem, size_t left_offset, size_t right_offset) {
207+
for (;;) {
207208

208-
if (!root) {
209-
return NULL;
210-
}
209+
if (!root) {
210+
return NULL;
211+
}
211212

212-
assert(elem);
213-
assert(root);
213+
assert(elem);
214+
assert(root);
214215

215-
if (comp(root, elem) == 0) {
216-
return root;
217-
}
216+
if (comp(root, elem) == 0) {
217+
return root;
218+
}
218219

219-
assert(elem);
220-
assert(root);
220+
assert(elem);
221+
assert(root);
221222

222-
if (comp(root, elem) > 0) {
223-
root = *(void**)(root + left_offset);
224-
}
225-
226-
/* don't compare nulls! */
227-
else
228-
229-
if (comp(root, elem) < 0) {
230-
root = *(void**)(root + right_offset);
231-
}
223+
if (comp(root, elem) > 0) {
224+
root = *(void **)(root + left_offset);
225+
}
226+
227+
/* don't compare nulls! */
228+
else
232229

230+
if (comp(root, elem) < 0) {
231+
root = *(void **)(root + right_offset);
233232
}
233+
}
234234
}

c_implementation/avl_impl.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,17 @@
33
#include <stddef.h>
44

55
/* elem: node */
6-
void* avl_find_impl(void* root, int (*comp)(const void*, const void*), void* elem, size_t left_offset, size_t right_offset);
6+
void *avl_find_impl(void *root, int (*comp)(const void *, const void *),
7+
void *elem, size_t left_offset, size_t right_offset);
78

89
/* elem with value: node */
910
void *avl_erase_by_value_impl(void *tree_root, void *elem, size_t node_size,
10-
int (*comp)(const void *, const void *), size_t loft,
11-
size_t roft, size_t hoft);
11+
int (*comp)(const void *, const void *),
12+
size_t loft, size_t roft, size_t hoft);
1213

1314
/* allocMem: prepared memory */
14-
void *avl_insert_impl(void *tree_root, void *elem, void *allocMem, size_t node_size,
15-
int (*comp)(const void *, const void *), size_t loft,
16-
size_t roft, size_t hoft);
15+
void *avl_insert_impl(void *tree_root, void *elem, void *allocMem,
16+
size_t node_size, int (*comp)(const void *, const void *),
17+
size_t loft, size_t roft, size_t hoft);
1718

1819
#endif

0 commit comments

Comments
 (0)