diff --git a/bpt.c b/bpt.c index 5666ace6e6b6bbfd41bb2d2d880b480f04015f29..dcbb7580f3cffcc501000ed0b9bc5ab5c53f8bb9 100644 --- a/bpt.c +++ b/bpt.c @@ -7,7 +7,7 @@ node *creat_node() { node *nd = malloc(sizeof(node)); // nd->key[0] = nb; - for (int i = 1; i < ORDER; i++) { + for (int i = 0; i < ORDER + 1; i++) { nd->key[i] = INT_MAX; } for (int i = 0; i < ORDER + 1; i++) { @@ -32,22 +32,47 @@ void destroy(node *nd) { void shift(node *nd, int index) { nd->kids[ORDER] = nd->kids[ORDER - 1]; for (int j = ORDER - 1; j > index; j--) { - // printf("im here 2 %d: et j : %d\n", nd->NbOfElementsInTable, j); + // printf("nb elements %d: and j : %d\n", nd->NbOfElementsInTable, j); nd->key[j] = nd->key[j - 1]; nd->kids[j + 1] = nd->kids[j]; } } node *split(node *nd) { - node *tmp = creat_node(); + // for (int k = 0; k < nd->NbOfElementsInTable; k++) { + // printf("%d ", nd->key[k]); + // } + + printf("\n"); + node *lhn = creat_node(); + node *rhn = creat_node(); + node *parent = creat_node(); + insert_key(parent, nd->key[ORDER / 2]); + parent->kids[0] = lhn; + parent->kids[1] = rhn; + for (int t = 0; t < ORDER / 2; t++) { - tmp->key[t] = nd->key[ORDER / 2 + 1]; - nd->key[ORDER / 2 + 1] = 0; - tmp->kids[t] = nd->kids[ORDER / 2 + 1]; - nd->kids[ORDER / 2 + 1] = NULL; - } - nd->NbOfElementsInTable /= 2; - tmp->NbOfElementsInTable = ORDER / 2; - return tmp; + insert_key(lhn, nd->key[t]); + // lhn->key[t] = nd->key[t]; + // lhn->key[t] = ; + lhn->kids[t] = NULL; + // lhn->NbOfElementsInTable++; + } + for (int i = ORDER / 2; i < nd->NbOfElementsInTable; i++) { + insert_key(rhn, nd->key[i]); + // rhn->key[i - ORDER / 2] = nd->key[i]; + // lhn->key[i] = ; + rhn->kids[i] = NULL; + // rhn->NbOfElementsInTable++; + } + if (is_a_leaf(lhn) && is_a_leaf(rhn)) { + lhn->next = rhn; + } + + // printf("nb of elements in lhn : %d\n", lhn->NbOfElementsInTable); + // printf("nb of elements in rhn : %d\n", rhn->NbOfElementsInTable); + // printf("nb of elements in parent : %d\n", parent->NbOfElementsInTable); + // free(nd); + return parent; } node *insert_key(node *nd, int value) { if (is_a_leaf(nd)) { @@ -58,24 +83,36 @@ node *insert_key(node *nd, int value) { shift(nd, i); nd->key[i] = value; nd->NbOfElementsInTable++; - printf("the kids : "); - for (int k = 0; k < nd->NbOfElementsInTable; k++) { - printf("%d ", nd->key[k]); - } - printf("\n"); - printf("Number of elements in the tab : %d\n", nd->NbOfElementsInTable); - return nd; - } - if (nd->key[i] == 0) { - nd->key[i] = value; - nd->NbOfElementsInTable++; + // printf("the kids : "); + // for (int k = 0; k < nd->NbOfElementsInTable; k++) { + // printf("%d ", nd->key[k]); + // } + // printf("\n"); return nd; } + // if (nd->key[i] == 0) { + // nd->key[i] = value; + // nd->NbOfElementsInTable++; + // return nd; + // } + } + if (nd->NbOfElementsInTable == ORDER) { + printf("u have to split\n"); + nd->key[ORDER] = value; + nd->NbOfElementsInTable++; + node *tmp = split(nd); + free(nd); + return tmp; } - if (nd->NbOfElementsInTable==ORDER) { - printf("u have to split\n"); + } else { + if (value < nd->key) { + insert_key(nd->kids[0], value); + } else { + insert_key(nd->kids[1], value); } } + printf("\n"); + printf("Number of elements in the tab : %d\n", nd->NbOfElementsInTable); return nd; } node search_key(node *nd, int key) { @@ -110,7 +147,8 @@ void print_tree(node *nd, int depth) { printf("the tree doesn't exist\n"); return; } - for (int i = 0; i < nd->NbOfElementsInTable + 1; i++) { + + for (int i = 0; i < nd->NbOfElementsInTable; i++) { printf("|%d\t", nd->key[i]); } printf("| \n"); @@ -119,6 +157,36 @@ void print_tree(node *nd, int depth) { } return; } + +void bp_print(node *root, int depth) { + // if we are on a leaf, we can print the values directly next to each other + if (is_a_leaf(root)) { + for (int i = 0; i < depth; i++) + printf(" "); + for (int i = 0; i < ORDER; i++) { + printf(" %d |", root->key[i]); + // if we reach a 0, we have seen every values in the node + if (root->key[i + 1] == 0) + break; + } + printf("\n"); + return; + } + + for (int i = 0; i < root->NbOfElementsInTable; i++) { + bp_print(root->kids[i], depth + 1); + printf("\n"); + + for (int i = 0; i < depth; i++) + printf(" "); + + printf(" %d |\n", root->key[i]); + + if (root->key[i + 1] == 0) + bp_print(root->kids[i + 1], depth + 1); + } + printf("\n"); +} // fuction to hash keys and transforming them into integers /* void hash(char *key, int length) { diff --git a/bpt.h b/bpt.h index 80bd82607cbcabd0797bb6bb35146285723ee495..2b043b943bb4e7ebfb23c3cbc7f3f83e4d1b9b3a 100644 --- a/bpt.h +++ b/bpt.h @@ -1,17 +1,17 @@ +#include <limits.h> #include <openssl/sha.h> #include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> -#include <limits.h> #ifndef B_PLUS_TREE #define B_PLUS_TREE #define ORDER 4 typedef struct node { int NbOfElementsInTable; - int key[ORDER ]; + int key[ORDER + 1]; struct node *kids[ORDER + 1]; struct node *next; } node; diff --git a/main.c b/main.c index a8b7c1c90b88b145fe8ca6284b36cc068f8d2a7e..00119a30fcd8de87d879b19f462a10307346db9b 100644 --- a/main.c +++ b/main.c @@ -12,14 +12,22 @@ int main() { new = insert_key(new, 3); new = insert_key(new, 2); new = insert_key(new, 1); - //new = insert_key(new, 0); - //new = insert_key(new, -1); - //new = insert_key(new, -2); - new = insert_key(new, -1094795589); + new = insert_key(new, 0); + // new = insert_key(new, -1); + // new = insert_key(new, -2); + // new = insert_key(new, -1094795589); new = insert_key(new, 6); + print_tree(new, 0); + printf("\n"); + printf("--------------------------------------\n"); + + // new = insert_key(new, 7); // new = insert_key(new, 4); + // new = insert_key(new, 5); print_tree(new, 0); - search_key(new, -1094795589); + // bp_print(new, 0); + destroy(new); + // search_key(new, -1094795589); return 0; } \ No newline at end of file