diff --git a/bp_tree.c b/bp_tree.c index 4ada116cc3902aff2e0b0d1071d6361d9b890fa7..b1d67df1e362d9b408f1e0bda8f98c81ccd407d9 100644 --- a/bp_tree.c +++ b/bp_tree.c @@ -152,31 +152,33 @@ control bp_split_unleaf(node *nd) { return new; } -// INSERT ---------------------------------------------------------- - -control bp_insert_into(node *nd, control val) { +void bp_do_the_insert(node *nd, control val) { // look for a 0 in the node (it is guarenteed to exist in this version of // the algorithm) for (int i = 0; i < M; i++) { // if we plainly find a 0 if (nd->data[i] == 0) { nd->data[i] = val.value; - // nd->childs[i] = val.lhs; nd->childs[i + 1] = val.rhs; break; } // if we need to insert the value between two values, we need to - // shifter everything greater than our value one case further + // shift everything greater than our value one case further if (nd->data[i] > val.value) { bp_node_shift(nd, i); nd->data[i] = val.value; - nd->childs[i] = val.rhs; + nd->childs[i + 1] = val.rhs; break; } } nd->count++; +} + +// INSERT ---------------------------------------------------------- +control bp_insert_into(node *nd, control val) { + bp_do_the_insert(nd, val); // if the node is now full, we split if (nd->count == M) { control v; @@ -213,26 +215,10 @@ control bp_insert(node *nd, control val, int depth) { break; } } + // treat the control return here + // if a split happened and we are not the root if (c.value != 0 && depth != 0) { - for (int i = 0; i < M; i++) { - // if we plainly find a 0 - if (nd->data[i] == 0) { - nd->data[i] = c.value; - // nd->childs[i] = val.lhs; - nd->childs[i + 1] = c.rhs; - break; - } - - // if we need to insert the value between two values, we need to - // shifter everything greater than our value one case further - if (nd->data[i] > val.value) { - bp_node_shift(nd, i); - nd->data[i] = val.value; - nd->childs[i] = val.rhs; - break; - } - } - nd->count++; + bp_do_the_insert(nd, c); // if after the child split, the node is full, split the node if (nd->count == M) @@ -252,33 +238,16 @@ control bp_insert(node *nd, control val, int depth) { node *bp_insert_val(node *tree, int val) { // Parse the val into a control struct then insert it in the tree control test = bp_insert(tree, value_to_insert(val), 0); - /* depending on the control item, we act differently if the control has pointers to node, then we had a split in the direct - childs of the root. We must add the values upringed to the root + childs of the root. We must add the values upringed to the root */ if (test.rhs != NULL) { - /* - if the root isn't a leaf, first we add the value into the node - we can't use bp_insert_into() as if we need a split, the way we - do it is slightly different - */ + + // if the root isn't a leaf, first we add the value into the node if (!bp_is_leaf(tree)) { - for (int i = 0; i < M; i++) { - if (tree->data[i] == 0) { - tree->childs[i + 1] = test.rhs; - tree->data[i] = test.value; - break; - } - if (tree->data[i] > test.value) { - bp_node_shift(tree, i); - tree->data[i] = test.value; - tree->childs[i + 1] = test.rhs; - break; - } - } - tree->count++; + bp_do_the_insert(tree, test); // If the root is full, we must split it if (tree->count == M) { return bp_split_root(tree);