Changeset cb01e1e in mainline for kernel/test/avltree/avltree1.c
- Timestamp:
- 2009-04-04T00:26:27Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- a85aebd
- Parents:
- 171f9a1
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/test/avltree/avltree1.c
r171f9a1 rcb01e1e 42 42 static avltree_node_t avltree_nodes[NODE_COUNT]; 43 43 44 /* 44 /* 45 45 * head of free nodes' list: 46 46 */ … … 59 59 if (!node) 60 60 return NULL; 61 61 62 62 if (node->lft) { 63 63 tmp = test_tree_parents(node->lft); 64 64 if (tmp != node) { 65 printf("Bad parent pointer key: %" PRIu6465 TPRINTF("Bad parent pointer key: %" PRIu64 66 66 ", address: %p\n", tmp->key, node->lft); 67 67 } … … 70 70 tmp = test_tree_parents(node->rgt); 71 71 if (tmp != node) { 72 printf("Bad parent pointer key: %" PRIu6472 TPRINTF("Bad parent pointer key: %" PRIu64 73 73 ", address: %p\n", 74 74 tmp->key,node->rgt); … … 81 81 { 82 82 int h1, h2, diff; 83 83 84 84 if (!node) 85 85 return 0; 86 86 87 h1 = test_tree_balance(node->lft); 87 88 h2 = test_tree_balance(node->rgt); 88 89 diff = h2 - h1; 89 if (diff != node->balance || (diff != -1 && diff != 0 && diff != 1)) { 90 printf("Bad balance\n"); 91 } 92 return h1 > h2 ? h1 + 1 : h2 + 1; 90 91 if ((diff != node->balance) || ((diff != -1) && (diff != 0) && (diff != 1))) 92 TPRINTF("Bad balance\n"); 93 94 return ((h1 > h2) ? (h1 + 1) : (h2 + 1)); 93 95 } 94 96 95 97 /** 96 98 * Prints the structure of the node, which is level levels from the top of the 97 * tree. 98 */ 99 static void 100 print_tree_structure_flat(avltree_node_t *node, int level) 99 * tree. 100 */ 101 static void print_tree_structure_flat(avltree_node_t *node, int level) 101 102 { 102 103 /* 103 104 * You can set the maximum level as high as you like. 104 105 105 * Most of the time, you'll want to debug code using small trees, 106 * so that a large level indicates a loop, which is a bug. 106 107 */ 107 108 if (level > 16) { 108 printf("[...]");109 TPRINTF("[...]"); 109 110 return; 110 111 } 111 112 112 113 if (node == NULL) 113 114 return; 114 115 printf("%" PRIu64 "[%" PRIu8 "]", node->key, node->balance);115 116 TPRINTF("%" PRIu64 "[%" PRIu8 "]", node->key, node->balance); 116 117 if (node->lft != NULL || node->rgt != NULL) { 117 printf("(");118 118 TPRINTF("("); 119 119 120 print_tree_structure_flat(node->lft, level + 1); 120 121 if (node->rgt != NULL) { 121 printf(",");122 TPRINTF(","); 122 123 print_tree_structure_flat(node->rgt, level + 1); 123 124 } 124 125 printf(")");125 126 TPRINTF(")"); 126 127 } 127 128 } … … 130 131 { 131 132 int i; 132 133 for (i = 0; i < NODE_COUNT - 1; i++) {133 134 for (i = 0; i < NODE_COUNT - 1; i++) 134 135 avltree_nodes[i].par = &avltree_nodes[i + 1]; 135 }136 136 137 avltree_nodes[i].par = NULL; 137 138 … … 140 141 * array. 141 142 */ 142 143 143 144 /* First tree node and same key */ 144 145 avltree_nodes[0].key = 60; 145 146 avltree_nodes[1].key = 60; 146 147 avltree_nodes[2].key = 60; 148 147 149 /* LL rotation */ 148 150 avltree_nodes[3].key = 50; 149 151 avltree_nodes[4].key = 40; 150 152 avltree_nodes[5].key = 30; 153 151 154 /* LR rotation */ 152 155 avltree_nodes[6].key = 20; … … 154 157 avltree_nodes[8].key = 25; 155 158 avltree_nodes[9].key = 25; 159 156 160 /* LL rotation in lower floor */ 157 161 avltree_nodes[10].key = 35; 162 158 163 /* RR rotation */ 159 164 avltree_nodes[11].key = 70; 160 165 avltree_nodes[12].key = 80; 166 161 167 /* RL rotation */ 162 168 avltree_nodes[13].key = 90; 163 169 avltree_nodes[14].key = 85; 170 164 171 /* Insert 0 key */ 165 172 avltree_nodes[15].key = 0; 166 173 avltree_nodes[16].key = 0; 174 167 175 /* Insert reverse */ 168 176 avltree_nodes[17].key = 600; … … 170 178 avltree_nodes[19].key = 400; 171 179 avltree_nodes[20].key = 300; 172 180 173 181 for (i = 21; i < NODE_COUNT; i++) 174 182 avltree_nodes[i].key = i * 3; … … 180 188 { 181 189 avltree_node_t *node; 182 190 183 191 node = first_free_node; 184 192 first_free_node = first_free_node->par; 185 193 186 194 return node; 187 195 } 188 196 189 static void test_tree_insert(avltree_t *tree, count_t node_count , bool quiet)197 static void test_tree_insert(avltree_t *tree, count_t node_count) 190 198 { 191 199 unsigned int i; 192 200 avltree_node_t *newnode; 193 201 194 202 avltree_create(tree); 195 203 196 if (!quiet) 197 printf("Inserting %" PRIc " nodes...", node_count); 198 204 TPRINTF("Inserting %" PRIc " nodes...", node_count); 205 199 206 for (i = 0; i < node_count; i++) { 200 207 newnode = alloc_avltree_node(); 201 208 202 209 avltree_insert(tree, newnode); 203 if (!quiet) { 204 test_tree_parents(tree->root); 205 test_tree_balance(tree->root); 206 } 207 } 208 209 if (!quiet) 210 printf("done.\n"); 211 } 212 210 test_tree_parents(tree->root); 211 test_tree_balance(tree->root); 212 } 213 214 TPRINTF("done.\n"); 215 } 213 216 214 217 static void test_tree_delete(avltree_t *tree, count_t node_count, 215 int node_position , bool quiet)218 int node_position) 216 219 { 217 220 avltree_node_t *delnode; … … 220 223 switch (node_position) { 221 224 case 0: 222 if (!quiet)223 printf("Deleting root nodes...");225 TPRINTF("Deleting root nodes..."); 226 224 227 while (tree->root != NULL) { 225 228 delnode = tree->root; 226 229 avltree_delete(tree, delnode); 227 if (!quiet) { 228 test_tree_parents(tree->root); 229 test_tree_balance(tree->root); 230 } 231 } 230 test_tree_parents(tree->root); 231 test_tree_balance(tree->root); 232 } 232 233 break; 233 234 case 1: 234 if (!quiet)235 printf("Deleting nodes according to creation time...");235 TPRINTF("Deleting nodes according to creation time..."); 236 236 237 for (i = 0; i < node_count; i++) { 237 238 avltree_delete(tree, &avltree_nodes[i]); 238 if (!quiet) { 239 test_tree_parents(tree->root); 240 test_tree_balance(tree->root); 241 } 242 } 243 break; 244 } 245 246 if (!quiet) 247 printf("done.\n"); 248 } 249 250 static void test_tree_delmin(avltree_t *tree, count_t node_count, bool quiet) 239 test_tree_parents(tree->root); 240 test_tree_balance(tree->root); 241 } 242 break; 243 } 244 245 TPRINTF("done.\n"); 246 } 247 248 static void test_tree_delmin(avltree_t *tree, count_t node_count) 251 249 { 252 250 unsigned int i = 0; 253 251 254 if (!quiet) 255 printf("Deleting minimum nodes..."); 252 TPRINTF("Deleting minimum nodes..."); 256 253 257 254 while (tree->root != NULL) { 258 255 i++; 259 256 avltree_delete_min(tree); 260 if (!quiet) { 261 test_tree_parents(tree->root); 262 test_tree_balance(tree->root); 263 } 264 } 265 266 if (!quiet && (i != node_count)) 267 printf("Bad node count. Some nodes have been lost!\n"); 268 269 if (!quiet) 270 printf("done.\n"); 271 } 272 273 char *test_avltree1(bool quiet) 257 test_tree_parents(tree->root); 258 test_tree_balance(tree->root); 259 } 260 261 if (i != node_count) 262 TPRINTF("Bad node count. Some nodes have been lost!\n"); 263 264 TPRINTF("done.\n"); 265 } 266 267 char *test_avltree1(void) 274 268 { 275 269 alloc_avltree_node_prepare(); 276 test_tree_insert(&avltree, NODE_COUNT , quiet);277 test_tree_delete(&avltree, NODE_COUNT, 0 , quiet);278 270 test_tree_insert(&avltree, NODE_COUNT); 271 test_tree_delete(&avltree, NODE_COUNT, 0); 272 279 273 alloc_avltree_node_prepare(); 280 test_tree_insert(&avltree, NODE_COUNT , quiet);281 test_tree_delete(&avltree, NODE_COUNT, 1 , quiet);282 274 test_tree_insert(&avltree, NODE_COUNT); 275 test_tree_delete(&avltree, NODE_COUNT, 1); 276 283 277 alloc_avltree_node_prepare(); 284 test_tree_insert(&avltree, NODE_COUNT , quiet);285 test_tree_delmin(&avltree, NODE_COUNT , quiet);286 278 test_tree_insert(&avltree, NODE_COUNT); 279 test_tree_delmin(&avltree, NODE_COUNT); 280 287 281 return NULL; 288 282 } 289
Note:
See TracChangeset
for help on using the changeset viewer.