diff --git a/b-tree.c b/b-tree.c index ffe1a25fb3d890929c0260f9ad55fb0e6a857e17..ab56ae42dd0847bf0a2bb65ef1d5d5d9177003f2 100644 --- a/b-tree.c +++ b/b-tree.c @@ -5,6 +5,13 @@ #include <stdio.h> #include <sys/types.h> +P_and_val create_P_and_val(void* pointer, uint64_t val){ + P_and_val to_return; + to_return.pointer = pointer; + to_return.val = val; + return to_return; +} + b_tree create_node(){ b_tree root = malloc(sizeof(b_node)); for(int i = 0; i < M+1; i++){ @@ -12,6 +19,7 @@ b_tree create_node(){ } for(int i = 0; i < M; i++){ root->keys[i] = 0; + root->data[i] = create_P_and_val(NULL, 0); } root->count = 0; return root; @@ -63,7 +71,7 @@ void print_node(b_tree node){ print_int_list(node->keys, 0, node->count, "", ", ", ""); // print unused spaces in keys(for debug) - //print_int_list(node->keys, node->count, M, ",(", ",", ")"); + print_int_list(node->keys, node->count, M, ",(", ",", ")"); // print pointers(for debug) //print_p_list(node->children, 0, M+1, " [", ",", "]"); @@ -76,13 +84,6 @@ void print_node(b_tree node){ printf(" count=%d\n",node->count); } -control create_control(b_tree pointer, uint64_t val){ - control to_return; - to_return.pointer = pointer; - to_return.val = val; - return to_return; -} - int find_insertion_index(uint64_t* lst, int count, uint64_t val){ int index = count; for(int i = 0; i < count; i++){ @@ -94,22 +95,22 @@ int find_insertion_index(uint64_t* lst, int count, uint64_t val){ return index; } -control split(b_tree node, b_tree next){ +P_and_val split(b_tree node){ b_tree newNode = create_node(); uint64_t pivot = node->keys[M/2]; if(is_leaf(node)){ for(int i = M/2; i < M; i++){ newNode->keys[i - M/2] = node->keys[i]; + newNode->data[i - M/2] = node->data[i]; node->keys[i] = 0; + node->data[i] = create_P_and_val(NULL, 0); } - for(int i = M/2+1; i <= M; i++){ - newNode->children[i - M/2] = node->children[i]; - node->children[i] = NULL; - } + // resize two nodes node->count = M/2; newNode->count = M - M/2; - newNode->children[M] = next; + + // connect node to newNode node->children[M] = newNode; } else{ @@ -119,69 +120,59 @@ control split(b_tree node, b_tree next){ node->keys[i] = 0; } for(int i = (M/2)+1; i <= M; i++){ - newNode->children[i-M/2-1] = node->children[i]; + newNode->children[i-(M/2 + 1)] = node->children[i]; node->children[i] = NULL; } + // resize two nodes node->count = M/2; newNode->count = M - M/2 - 1; } - return create_control(newNode, pivot); + return create_P_and_val(newNode, pivot); } -control insert_into_node(b_tree node, uint64_t key, record_t* record){ +P_and_val insert_into_node(b_tree node, uint64_t key, P_and_val data){ int index = find_insertion_index(node->keys, node->count, key); - // insert val into not full list of keys + // insert key and data into list their respective list for(int i = node->count-1; i >= index; i--){ node->keys[i+1] = node->keys[i]; + node->data[i+1] = node->data[i]; } node->keys[index] = key; + node->data[index] = data; node->count += 1; - // pointer to next leaf - b_tree next = node->children[M]; - - // insert pointer to record into not full list of children - if(is_leaf(node)){ - for(int i = node->count-1; i >= index+1; i--){ - node->children[i+1] = node->children[i]; - } - node->children[index+1] = record; - } - - if(node->count < M){ - return create_control(NULL, 0); + return create_P_and_val(NULL, 0); } else{ - return split(node, next); + return split(node); } } -control insert(b_tree tree, uint64_t key, record_t* record){ - control retenue = create_control(NULL, 0); +P_and_val insert(b_tree tree, uint64_t key, P_and_val data){ + P_and_val retenue = create_P_and_val(NULL, 0); if (is_leaf(tree)){ - retenue = insert_into_node(tree, key, record); + retenue = insert_into_node(tree, key, data); } else{ int index = find_insertion_index(tree->keys, tree->count, key); - retenue = insert(tree->children[index], key, record); + retenue = insert(tree->children[index], key, data); if(retenue.pointer != NULL){ for(int i = tree->count; i >=index+1; i--){ tree->children[i+1] = tree->children[i]; } tree->children[index+1] = retenue.pointer; - retenue = insert_into_node(tree, retenue.val, record); + retenue = insert_into_node(tree, retenue.val, data); } } return retenue; } -b_tree insert_into_tree(b_tree tree, uint64_t key, record_t* record){ - control retenue = insert(tree, key, record); +b_tree insert_into_tree(b_tree tree, uint64_t key, P_and_val data){ + P_and_val retenue = insert(tree, key, data); if(retenue.pointer != NULL){ - //printf("il y a une retenue\n"); b_tree newRoot = create_node(); newRoot->children[0] = tree; newRoot->keys[0] = retenue.val; @@ -192,20 +183,18 @@ b_tree insert_into_tree(b_tree tree, uint64_t key, record_t* record){ return tree; } -record_t* search(b_tree tree, uint64_t key){ +P_and_val search(b_tree tree, uint64_t key){ int index = find_insertion_index(tree->keys, tree->count, key); - //printf("%d\n", index); if(!is_leaf(tree)){ return search(tree->children[index], key); } else{ - //printf("leaf: %lu, %lu\n", tree->keys[index-1], key); // gerer collisions ? if(tree->keys[index-1] == key){ - return tree->children[index]; + return tree->data[index-1]; } else{ - return NULL; + return create_P_and_val(NULL, 0); } } } @@ -218,5 +207,11 @@ void free_b(b_tree node){ } } } + for(int i = 0; i < node->count; i++){ + record_t* data = node->data[i].pointer; + if(data != NULL){ + free(data); + } + } free(node); } \ No newline at end of file diff --git a/b-tree.h b/b-tree.h index 82d2f0b1bfc58332af5304416704b506ea129413..c499b4ee910c3d3191e2ce768b456dedfb4e40e9 100644 --- a/b-tree.h +++ b/b-tree.h @@ -7,30 +7,31 @@ #define M 4 +typedef struct _P_and_val{ + uint64_t val; + void* pointer; +}P_and_val; + typedef struct _b_node{ - void* children[M+1]; + struct _b_node* children[M+1]; uint64_t keys[M]; + P_and_val data[M]; int count; }b_node; typedef b_node* b_tree; -typedef struct _control{ - uint64_t val; - b_tree pointer; -}control; - +P_and_val create_P_and_val(void* pointer, uint64_t val); b_tree create_node(); bool is_leaf(b_tree node); void print_node(b_tree node); void print_tree(b_tree tree, int depth); int find_insertion_index(uint64_t* lst, int size, uint64_t val); -void insert_into_not_full_list(uint64_t* lst, int count, int val); -control split(b_tree node, b_tree next); -control insert_into_node(b_tree node, uint64_t key, record_t* record); -control insert(b_tree tree, uint64_t key, record_t* record); -b_tree insert_into_tree(b_tree tree, uint64_t key, record_t* record); -record_t* search(b_tree tree, uint64_t key); +P_and_val split(b_tree node); +P_and_val insert_into_node(b_tree node, uint64_t key, P_and_val data); +P_and_val insert(b_tree tree, uint64_t key, P_and_val data); +b_tree insert_into_tree(b_tree tree, uint64_t key, P_and_val data); +P_and_val search(b_tree tree, uint64_t key); void free_b(b_tree node); #endif \ No newline at end of file diff --git a/main.c b/main.c index 96622a5c951c3eb4043451b000dc89565e38b66f..042f468cc414489b10d83e8b25b84b4c7c1e290c 100644 --- a/main.c +++ b/main.c @@ -37,8 +37,8 @@ void write_database_to_disk(char* fileName, b_tree node){ node = node->children[0]; } while (node != NULL) { - for(int i = 1; i <= node->count; i++){ - record_t* truc = node->children[i]; + for(int i = 0; i < node->count; i++){ + record_t* truc = node->data[i].pointer; //print_record(*truc); fwrite(truc, sizeof(record_t), 1, f); } @@ -64,7 +64,7 @@ record_t* read_data_from_disk(char* fileName, int index){ int main(){ record_t* r0 = create_record(2000, 0, 0, "0", "daniel", "rodriguez"); record_t* r1 = create_record(2001, 1, 1, "1", "pierre", "roden"); - record_t* r2 = create_record(2002, 2, 2, "2", "gaetan", "siffert"); + record_t* r2 = create_record(2002, 2, 2, "2", "gagaetan", "siffert"); record_t* r3 = create_record(2003, 3, 3, "3", "lucas", "tschaler"); record_t* r4 = create_record(2004, 4, 4, "4", "antoine", "gilles"); record_t* r5 = create_record(2005, 5, 5, "5", "william", "ho"); @@ -74,17 +74,17 @@ int main(){ b_tree node = create_node(); - node = insert_into_tree(node, record_hash(r0), r0); - node = insert_into_tree(node, record_hash(r1), r1); - node = insert_into_tree(node, record_hash(r2), r2); - node = insert_into_tree(node, record_hash(r3), r3); - node = insert_into_tree(node, record_hash(r4), r4); - node = insert_into_tree(node, record_hash(r5), r5); + node = insert_into_tree(node, record_hash(r0), create_P_and_val(r0, 0)); + node = insert_into_tree(node, record_hash(r1), create_P_and_val(r1, 0)); + node = insert_into_tree(node, record_hash(r2), create_P_and_val(r2, 0)); + node = insert_into_tree(node, record_hash(r3), create_P_and_val(r3, 0)); + node = insert_into_tree(node, record_hash(r4), create_P_and_val(r4, 0)); + node = insert_into_tree(node, record_hash(r5), create_P_and_val(r5, 0)); print_tree(node, 0); - //write_database_to_disk("test.dat", node); + write_database_to_disk("test.dat", node); - record_t* s0 = search(node, 17);//daniel + record_t* s0 = search(node, record_hash(r0)).pointer;//daniel if(s0 == NULL){ printf("\n"); printf("could not find\n"); @@ -93,10 +93,10 @@ int main(){ print_record(*s0); } printf("\n"); - record_t* s1 = search(node, record_hash(r2));//gaetan + record_t* s1 = search(node, record_hash(r2)).pointer;//gaetan print_record(*s1); printf("\n"); - record_t* s2 = search(node, record_hash(r4));//antoine + record_t* s2 = search(node, record_hash(r4)).pointer;//antoine print_record(*s2); /* @@ -107,13 +107,13 @@ int main(){ record_t* test1 = read_data_from_disk("test.dat", 1); print_record(*test1); free(test1); - */ free(r0); free(r1); free(r2); free(r3); free(r4); free(r5); + */ free_b(node); return EXIT_SUCCESS; } \ No newline at end of file