Rev 2089 | Rev 2216 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2089 | Rev 2111 | ||
---|---|---|---|
Line 135... | Line 135... | ||
135 | * |
135 | * |
136 | * @param root Root of the subtree. |
136 | * @param root Root of the subtree. |
137 | */ |
137 | */ |
138 | void btree_destroy_subtree(btree_node_t *root) |
138 | void btree_destroy_subtree(btree_node_t *root) |
139 | { |
139 | { |
140 | int i; |
140 | count_t i; |
141 | 141 | ||
142 | if (root->keys) { |
142 | if (root->keys) { |
143 | for (i = 0; i < root->keys + 1; i++) { |
143 | for (i = 0; i < root->keys + 1; i++) { |
144 | if (root->subtree[i]) |
144 | if (root->subtree[i]) |
145 | btree_destroy_subtree(root->subtree[i]); |
145 | btree_destroy_subtree(root->subtree[i]); |
Line 267... | Line 267... | ||
267 | if (!try_rotation_from_left(node)) |
267 | if (!try_rotation_from_left(node)) |
268 | try_rotation_from_right(node); |
268 | try_rotation_from_right(node); |
269 | } |
269 | } |
270 | 270 | ||
271 | if (node->keys > FILL_FACTOR) { |
271 | if (node->keys > FILL_FACTOR) { |
272 | int i; |
272 | count_t i; |
273 | 273 | ||
274 | /* |
274 | /* |
275 | * The key can be immediatelly removed. |
275 | * The key can be immediatelly removed. |
276 | * |
276 | * |
277 | * Note that the right subtree is removed because when |
277 | * Note that the right subtree is removed because when |
Line 333... | Line 333... | ||
333 | if (key < cur->key[0]) { |
333 | if (key < cur->key[0]) { |
334 | next = cur->subtree[0]; |
334 | next = cur->subtree[0]; |
335 | continue; |
335 | continue; |
336 | } else { |
336 | } else { |
337 | void *val; |
337 | void *val; |
338 | int i; |
338 | count_t i; |
339 | 339 | ||
340 | /* |
340 | /* |
341 | * Now if the key is smaller than cur->key[i] |
341 | * Now if the key is smaller than cur->key[i] |
342 | * it can only mean that the value is in cur->subtree[i] |
342 | * it can only mean that the value is in cur->subtree[i] |
343 | * or it is not in the tree at all. |
343 | * or it is not in the tree at all. |
Line 440... | Line 440... | ||
440 | * @param value Pointer to value to be inserted. |
440 | * @param value Pointer to value to be inserted. |
441 | * @param lsubtree Pointer to the left subtree. |
441 | * @param lsubtree Pointer to the left subtree. |
442 | */ |
442 | */ |
443 | void node_insert_key_and_lsubtree(btree_node_t *node, btree_key_t key, void *value, btree_node_t *lsubtree) |
443 | void node_insert_key_and_lsubtree(btree_node_t *node, btree_key_t key, void *value, btree_node_t *lsubtree) |
444 | { |
444 | { |
445 | int i; |
445 | count_t i; |
446 | 446 | ||
447 | for (i = 0; i < node->keys; i++) { |
447 | for (i = 0; i < node->keys; i++) { |
448 | if (key < node->key[i]) { |
448 | if (key < node->key[i]) { |
449 | int j; |
449 | count_t j; |
450 | 450 | ||
451 | for (j = node->keys; j > i; j--) { |
451 | for (j = node->keys; j > i; j--) { |
452 | node->key[j] = node->key[j - 1]; |
452 | node->key[j] = node->key[j - 1]; |
453 | node->value[j] = node->value[j - 1]; |
453 | node->value[j] = node->value[j - 1]; |
454 | node->subtree[j + 1] = node->subtree[j]; |
454 | node->subtree[j + 1] = node->subtree[j]; |
Line 476... | Line 476... | ||
476 | * @param value Pointer to value to be inserted. |
476 | * @param value Pointer to value to be inserted. |
477 | * @param rsubtree Pointer to the right subtree. |
477 | * @param rsubtree Pointer to the right subtree. |
478 | */ |
478 | */ |
479 | void node_insert_key_and_rsubtree(btree_node_t *node, btree_key_t key, void *value, btree_node_t *rsubtree) |
479 | void node_insert_key_and_rsubtree(btree_node_t *node, btree_key_t key, void *value, btree_node_t *rsubtree) |
480 | { |
480 | { |
481 | int i; |
481 | count_t i; |
482 | 482 | ||
483 | for (i = 0; i < node->keys; i++) { |
483 | for (i = 0; i < node->keys; i++) { |
484 | if (key < node->key[i]) { |
484 | if (key < node->key[i]) { |
485 | int j; |
485 | count_t j; |
486 | 486 | ||
487 | for (j = node->keys; j > i; j--) { |
487 | for (j = node->keys; j > i; j--) { |
488 | node->key[j] = node->key[j - 1]; |
488 | node->key[j] = node->key[j - 1]; |
489 | node->value[j] = node->value[j - 1]; |
489 | node->value[j] = node->value[j - 1]; |
490 | node->subtree[j + 1] = node->subtree[j]; |
490 | node->subtree[j + 1] = node->subtree[j]; |
Line 508... | Line 508... | ||
508 | * @param node B-tree node. |
508 | * @param node B-tree node. |
509 | * @param key Key to be removed. |
509 | * @param key Key to be removed. |
510 | */ |
510 | */ |
511 | void node_remove_key_and_lsubtree(btree_node_t *node, btree_key_t key) |
511 | void node_remove_key_and_lsubtree(btree_node_t *node, btree_key_t key) |
512 | { |
512 | { |
513 | int i, j; |
513 | count_t i, j; |
514 | 514 | ||
515 | for (i = 0; i < node->keys; i++) { |
515 | for (i = 0; i < node->keys; i++) { |
516 | if (key == node->key[i]) { |
516 | if (key == node->key[i]) { |
517 | for (j = i + 1; j < node->keys; j++) { |
517 | for (j = i + 1; j < node->keys; j++) { |
518 | node->key[j - 1] = node->key[j]; |
518 | node->key[j - 1] = node->key[j]; |
Line 536... | Line 536... | ||
536 | * @param node B-tree node. |
536 | * @param node B-tree node. |
537 | * @param key Key to be removed. |
537 | * @param key Key to be removed. |
538 | */ |
538 | */ |
539 | void node_remove_key_and_rsubtree(btree_node_t *node, btree_key_t key) |
539 | void node_remove_key_and_rsubtree(btree_node_t *node, btree_key_t key) |
540 | { |
540 | { |
541 | int i, j; |
541 | count_t i, j; |
542 | 542 | ||
543 | for (i = 0; i < node->keys; i++) { |
543 | for (i = 0; i < node->keys; i++) { |
544 | if (key == node->key[i]) { |
544 | if (key == node->key[i]) { |
545 | for (j = i + 1; j < node->keys; j++) { |
545 | for (j = i + 1; j < node->keys; j++) { |
546 | node->key[j - 1] = node->key[j]; |
546 | node->key[j - 1] = node->key[j]; |
Line 574... | Line 574... | ||
574 | * @return Newly created right sibling of node. |
574 | * @return Newly created right sibling of node. |
575 | */ |
575 | */ |
576 | btree_node_t *node_split(btree_node_t *node, btree_key_t key, void *value, btree_node_t *rsubtree, btree_key_t *median) |
576 | btree_node_t *node_split(btree_node_t *node, btree_key_t key, void *value, btree_node_t *rsubtree, btree_key_t *median) |
577 | { |
577 | { |
578 | btree_node_t *rnode; |
578 | btree_node_t *rnode; |
579 | int i, j; |
579 | count_t i, j; |
580 | 580 | ||
581 | ASSERT(median); |
581 | ASSERT(median); |
582 | ASSERT(node->keys == BTREE_MAX_KEYS); |
582 | ASSERT(node->keys == BTREE_MAX_KEYS); |
583 | 583 | ||
584 | /* |
584 | /* |
Line 601... | Line 601... | ||
601 | 601 | ||
602 | /* |
602 | /* |
603 | * Copy big keys, values and subtree pointers to the new right sibling. |
603 | * Copy big keys, values and subtree pointers to the new right sibling. |
604 | * If this is an index node, do not copy the median. |
604 | * If this is an index node, do not copy the median. |
605 | */ |
605 | */ |
606 | i = (int) INDEX_NODE(node); |
606 | i = (count_t) INDEX_NODE(node); |
607 | for (i += MEDIAN_HIGH_INDEX(node), j = 0; i < node->keys; i++, j++) { |
607 | for (i += MEDIAN_HIGH_INDEX(node), j = 0; i < node->keys; i++, j++) { |
608 | rnode->key[j] = node->key[i]; |
608 | rnode->key[j] = node->key[i]; |
609 | rnode->value[j] = node->value[i]; |
609 | rnode->value[j] = node->value[i]; |
610 | rnode->subtree[j] = node->subtree[i]; |
610 | rnode->subtree[j] = node->subtree[i]; |
611 | 611 | ||
Line 636... | Line 636... | ||
636 | */ |
636 | */ |
637 | btree_node_t *node_combine(btree_node_t *node) |
637 | btree_node_t *node_combine(btree_node_t *node) |
638 | { |
638 | { |
639 | index_t idx; |
639 | index_t idx; |
640 | btree_node_t *rnode; |
640 | btree_node_t *rnode; |
641 | int i; |
641 | count_t i; |
642 | 642 | ||
643 | ASSERT(!ROOT_NODE(node)); |
643 | ASSERT(!ROOT_NODE(node)); |
644 | 644 | ||
645 | idx = find_key_by_subtree(node->parent, node, false); |
645 | idx = find_key_by_subtree(node->parent, node, false); |
646 | if (idx == node->parent->keys) { |
646 | if (idx == node->parent->keys) { |
Line 685... | Line 685... | ||
685 | * |
685 | * |
686 | * @return Index of the key associated with the subtree. |
686 | * @return Index of the key associated with the subtree. |
687 | */ |
687 | */ |
688 | index_t find_key_by_subtree(btree_node_t *node, btree_node_t *subtree, bool right) |
688 | index_t find_key_by_subtree(btree_node_t *node, btree_node_t *subtree, bool right) |
689 | { |
689 | { |
690 | int i; |
690 | count_t i; |
691 | 691 | ||
692 | for (i = 0; i < node->keys + 1; i++) { |
692 | for (i = 0; i < node->keys + 1; i++) { |
693 | if (subtree == node->subtree[i]) |
693 | if (subtree == node->subtree[i]) |
694 | return i - (int) (right != false); |
694 | return i - (int) (right != false); |
695 | } |
695 | } |
Line 938... | Line 938... | ||
938 | * |
938 | * |
939 | * @param t Print out B-tree. |
939 | * @param t Print out B-tree. |
940 | */ |
940 | */ |
941 | void btree_print(btree_t *t) |
941 | void btree_print(btree_t *t) |
942 | { |
942 | { |
- | 943 | count_t i; |
|
943 | int i, depth = t->root->depth; |
944 | int depth = t->root->depth; |
944 | link_t head, *cur; |
945 | link_t head, *cur; |
945 | 946 | ||
946 | printf("Printing B-tree:\n"); |
947 | printf("Printing B-tree:\n"); |
947 | list_initialize(&head); |
948 | list_initialize(&head); |
948 | list_append(&t->root->bfs_link, &head); |
949 | list_append(&t->root->bfs_link, &head); |