Rev 3022 | Rev 4296 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3022 | Rev 4055 | ||
---|---|---|---|
Line 46... | Line 46... | ||
46 | */ |
46 | */ |
47 | static avltree_node_t *first_free_node = NULL; |
47 | static avltree_node_t *first_free_node = NULL; |
48 | 48 | ||
49 | static int test_tree_balance(avltree_node_t *node); |
49 | static int test_tree_balance(avltree_node_t *node); |
50 | static avltree_node_t *test_tree_parents(avltree_node_t *node); |
50 | static avltree_node_t *test_tree_parents(avltree_node_t *node); |
51 | static void print_tree_structure_flat (avltree_node_t *node, int level); |
51 | static void print_tree_structure_flat (avltree_node_t *node, int level) |
- | 52 | __attribute__ ((used)); |
|
52 | static avltree_node_t *alloc_avltree_node(void); |
53 | static avltree_node_t *alloc_avltree_node(void); |
53 | 54 | ||
54 | static avltree_node_t *test_tree_parents(avltree_node_t *node) |
55 | static avltree_node_t *test_tree_parents(avltree_node_t *node) |
55 | { |
56 | { |
56 | avltree_node_t *tmp; |
57 | avltree_node_t *tmp; |
Line 59... | Line 60... | ||
59 | return NULL; |
60 | return NULL; |
60 | 61 | ||
61 | if (node->lft) { |
62 | if (node->lft) { |
62 | tmp = test_tree_parents(node->lft); |
63 | tmp = test_tree_parents(node->lft); |
63 | if (tmp != node) { |
64 | if (tmp != node) { |
64 | printf("Bad parent pointer key: %d, address: %p\n", |
65 | printf("Bad parent pointer key: %" PRIu64 |
65 | tmp->key, node->lft); |
66 | ", address: %p\n", tmp->key, node->lft); |
66 | } |
67 | } |
67 | } |
68 | } |
68 | if (node->rgt) { |
69 | if (node->rgt) { |
69 | tmp = test_tree_parents(node->rgt); |
70 | tmp = test_tree_parents(node->rgt); |
70 | if (tmp != node) { |
71 | if (tmp != node) { |
71 | printf("Bad parent pointer key: %d, address: %p\n", |
72 | printf("Bad parent pointer key: %" PRIu64 |
- | 73 | ", address: %p\n", |
|
72 | tmp->key,node->rgt); |
74 | tmp->key,node->rgt); |
73 | } |
75 | } |
74 | } |
76 | } |
75 | return node->par; |
77 | return node->par; |
76 | } |
78 | } |
Line 92... | Line 94... | ||
92 | 94 | ||
93 | /** |
95 | /** |
94 | * Prints the structure of the node, which is level levels from the top of the |
96 | * Prints the structure of the node, which is level levels from the top of the |
95 | * tree. |
97 | * tree. |
96 | */ |
98 | */ |
- | 99 | static void |
|
97 | static void print_tree_structure_flat(avltree_node_t *node, int level) |
100 | print_tree_structure_flat(avltree_node_t *node, int level) |
98 | { |
101 | { |
99 | /* |
102 | /* |
100 | * You can set the maximum level as high as you like. |
103 | * You can set the maximum level as high as you like. |
101 | * Most of the time, you'll want to debug code using small trees, |
104 | * Most of the time, you'll want to debug code using small trees, |
102 | * so that a large level indicates a loop, which is a bug. |
105 | * so that a large level indicates a loop, which is a bug. |
Line 107... | Line 110... | ||
107 | } |
110 | } |
108 | 111 | ||
109 | if (node == NULL) |
112 | if (node == NULL) |
110 | return; |
113 | return; |
111 | 114 | ||
112 | printf("%d[%d]", node->key, node->balance); |
115 | printf("%" PRIu64 "[%" PRIu8 "]", node->key, node->balance); |
113 | if (node->lft != NULL || node->rgt != NULL) { |
116 | if (node->lft != NULL || node->rgt != NULL) { |
114 | printf("("); |
117 | printf("("); |
115 | 118 | ||
116 | print_tree_structure_flat(node->lft, level + 1); |
119 | print_tree_structure_flat(node->lft, level + 1); |
117 | if (node->rgt != NULL) { |
120 | if (node->rgt != NULL) { |
Line 128... | Line 131... | ||
128 | int i; |
131 | int i; |
129 | 132 | ||
130 | for (i = 0; i < NODE_COUNT - 1; i++) { |
133 | for (i = 0; i < NODE_COUNT - 1; i++) { |
131 | avltree_nodes[i].par = &avltree_nodes[i + 1]; |
134 | avltree_nodes[i].par = &avltree_nodes[i + 1]; |
132 | } |
135 | } |
- | 136 | avltree_nodes[i].par = NULL; |
|
133 | 137 | ||
134 | /* |
138 | /* |
135 | * Node keys which will be used for insertion. Up to NODE_COUNT size of |
139 | * Node keys which will be used for insertion. Up to NODE_COUNT size of |
136 | * array. |
140 | * array. |
137 | */ |
141 | */ |
Line 167... | Line 171... | ||
167 | avltree_nodes[20].key = 300; |
171 | avltree_nodes[20].key = 300; |
168 | 172 | ||
169 | for (i = 21; i < NODE_COUNT; i++) |
173 | for (i = 21; i < NODE_COUNT; i++) |
170 | avltree_nodes[i].key = i * 3; |
174 | avltree_nodes[i].key = i * 3; |
171 | 175 | ||
172 | avltree_nodes[i].par = NULL; |
- | |
173 | first_free_node = &avltree_nodes[0]; |
176 | first_free_node = &avltree_nodes[0]; |
174 | } |
177 | } |
175 | 178 | ||
176 | static avltree_node_t *alloc_avltree_node(void) |
179 | static avltree_node_t *alloc_avltree_node(void) |
177 | { |
180 | { |
Line 189... | Line 192... | ||
189 | avltree_node_t *newnode; |
192 | avltree_node_t *newnode; |
190 | 193 | ||
191 | avltree_create(tree); |
194 | avltree_create(tree); |
192 | 195 | ||
193 | if (!quiet) |
196 | if (!quiet) |
194 | printf("Inserting %d nodes...", node_count); |
197 | printf("Inserting %" PRIc " nodes...", node_count); |
195 | 198 | ||
196 | for (i = 0; i < node_count; i++) { |
199 | for (i = 0; i < node_count; i++) { |
197 | newnode = alloc_avltree_node(); |
200 | newnode = alloc_avltree_node(); |
198 | 201 | ||
199 | avltree_insert(tree, newnode); |
202 | avltree_insert(tree, newnode); |