diff --git a/b-tree.c b/b-tree.c index e0e0b75d190eebc9e345918d57c7a7fe58a7bca2..ffe1a25fb3d890929c0260f9ad55fb0e6a857e17 100644 --- a/b-tree.c +++ b/b-tree.c @@ -32,7 +32,7 @@ void print_tree(b_tree tree, int depth){ print_tree(tree->children[i], depth+1); } else { - for(int i = 0; i < depth+1; i++){ + for(int j = 0; j < depth+1; j++){ printf(" "); } printf("Empty\n"); @@ -83,7 +83,7 @@ control create_control(b_tree pointer, uint64_t val){ return to_return; } -int find_insertion_index(uint64_t* lst, int count, int val){ +int find_insertion_index(uint64_t* lst, int count, uint64_t val){ int index = count; for(int i = 0; i < count; i++){ if(val < lst[i]){ @@ -96,7 +96,7 @@ int find_insertion_index(uint64_t* lst, int count, int val){ control split(b_tree node, b_tree next){ b_tree newNode = create_node(); - int pivot = node->keys[M/2]; + uint64_t pivot = node->keys[M/2]; if(is_leaf(node)){ for(int i = M/2; i < M; i++){ diff --git a/b-tree.h b/b-tree.h index 2505aee843ae351d3157a357cd41ecbb8784b334..82d2f0b1bfc58332af5304416704b506ea129413 100644 --- a/b-tree.h +++ b/b-tree.h @@ -21,9 +21,10 @@ typedef struct _control{ }control; 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, int val); +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); diff --git a/main.c b/main.c index 7c2afb4417dd7635d2df686b208e200e87719bb1..96622a5c951c3eb4043451b000dc89565e38b66f 100644 --- a/main.c +++ b/main.c @@ -19,7 +19,7 @@ uint64_t hash(char* s){ val <<= 8; val |= hash[i]; } - printf("%lu\n", val); + //printf("%lu\n", val); return val; } @@ -27,58 +27,93 @@ uint64_t record_hash(record_t* r){ return hash(r->phone); } -void write_database_to_disk(char* fileName, record_t* database, int size){ +void write_database_to_disk(char* fileName, b_tree node){ FILE* f; f = fopen(fileName, "wb"); if(f == NULL){ assert(false); } - - fwrite(database, sizeof(record_t), size, f); + while (!is_leaf(node)) { + node = node->children[0]; + } + while (node != NULL) { + for(int i = 1; i <= node->count; i++){ + record_t* truc = node->children[i]; + //print_record(*truc); + fwrite(truc, sizeof(record_t), 1, f); + } + node = node->children[M]; + } fclose(f); } -void read_database_from_disk(char* fileName, record_t* database, int size){ +record_t* read_data_from_disk(char* fileName, int index){ + record_t* data = malloc(sizeof(record_t)); FILE* f; f = fopen(fileName, "rb"); if(f == NULL){ assert(false); } - - fread(database, sizeof(record_t), size, f); + fseek(f, index*sizeof(record_t), SEEK_SET); + fread(data, sizeof(record_t), 1, f); fclose(f); + return data; } + int main(){ - //hash("essdfuihfs"); - b_tree node = create_node(); - date_t date = create_date(1999, 7, 4); - record_t* r = create_record(date, "0765060219", "daniel", "rodriguez"); - //print_record(*r); - printf("pointer to record: %p\n", r); - - for(int i = 0; i <= 150; i += 10){ - node = insert_into_tree(node, i, r); - } + 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* 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"); - node = insert_into_tree(node, 15, r); - node = insert_into_tree(node, 18, r); + //record_t* a = record_prompt(); + //record_t* b = record_prompt(); + 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); print_tree(node, 0); - - record_t* s = search(node, 15); - printf("result of search: %p\n", s); - - uint64_t a[4] = {0, 2, 4, 5}; - printf("%d\n", find_insertion_index(a, 4, 2)); - - //write_database_to_disk("test.dat", r, 1); - record_t* test = malloc(sizeof(record_t)); - read_database_from_disk("test.dat", test, 1); - print_record(*test); - free_b(node); - free(r); + //write_database_to_disk("test.dat", node); + + record_t* s0 = search(node, 17);//daniel + if(s0 == NULL){ + printf("\n"); + printf("could not find\n"); + } + else{ + print_record(*s0); + } + printf("\n"); + record_t* s1 = search(node, record_hash(r2));//gaetan + print_record(*s1); + printf("\n"); + record_t* s2 = search(node, record_hash(r4));//antoine + print_record(*s2); + + /* + record_t* test = read_data_from_disk("test.dat", 0); + print_record(*test); free(test); + printf("\n"); + 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 diff --git a/record.c b/record.c index 7afa86f9dd381ef32b5092aa179198469caeb96d..e864e8821c7349cf2d6f020657f59cf7552a4052 100644 --- a/record.c +++ b/record.c @@ -3,6 +3,13 @@ #include <stdlib.h> #include <string.h> #include <stdio.h> +#include <assert.h> + + +void flush_input() { + int c; + while ((c = getchar()) != '\n' && c != EOF); +} date_t create_date(uint16_t year, uint8_t month, uint8_t day){ date_t newDate; @@ -12,9 +19,9 @@ date_t create_date(uint16_t year, uint8_t month, uint8_t day){ return newDate; } -record_t* create_record(date_t birth_date, char phone[10], char first_name[20], char last_name[20]){ +record_t* create_record(uint16_t year, uint8_t month, uint8_t day, char phone[10], char first_name[20], char last_name[20]){ record_t* newRecord = malloc(sizeof(record_t)); - newRecord->birth_date = birth_date; + newRecord->birth_date = create_date(year, month, day); strcpy(newRecord->phone, phone); strcpy(newRecord->forename, first_name); strcpy(newRecord->surname, last_name); @@ -28,11 +35,6 @@ void print_record(record_t record){ printf("birth date: %hu-%hhu-%hhu\n", record.birth_date.year, record.birth_date.month, record.birth_date.day); } -void flush_input() { - int c; - while ((c = getchar()) != '\n' && c != EOF); -} - record_t* record_prompt(){ printf("what is your first name ?\n"); char first_name[20]; @@ -49,26 +51,73 @@ record_t* record_prompt(){ scanf(" %9s", phone); flush_input(); - printf("what is your birth year?\n"); + printf("what is your birth year ? (input as number)\n"); uint16_t year; scanf("%hu", &year); flush_input(); - printf("what is your birth month?\n"); + printf("what is your birth month ? (input as number)\n"); uint8_t month; scanf("%hhu", &month); flush_input(); - printf("what is your birth day?\n"); + printf("what is your birth day ? (input as number)\n"); uint8_t day; scanf("%hhu", &day); flush_input(); - date_t newDate = create_date(year, month, day); - return create_record(newDate, phone, first_name, last_name); + return create_record(year, month, day, phone, first_name, last_name); } -/*int main(){ - record_t r = record_prompt(); - print_record(r); -}*/ \ No newline at end of file +/* +void handle_bounds(database_t* d, int index){ + if(index < 0 || index >= d->count){ + assert(0); + } +} + +database_t* create_database(){ + database_t* d = malloc(sizeof(database_t)); + d->size = 4; + d->count = 0; + d->data = malloc(d->size * sizeof(record_t)); + return d; +} + +void database_add(database_t* d, record_t* record){ + if(d->count >= d->size){ + d->size *= 2; + d->data = realloc(d->data, d->size * sizeof(record_t)); + } + d->data[d->count] = *record; + d->count += 1; +} + +void database_remove(database_t* v, int index){ + handle_bounds(v, index); + for(int i = index; i < v->count-1; i++){ + v->data[i] = v->data[i+1]; + } + + v->count -= 1; + if(v->count < 0){ + assert(0); + } + if(v->count < (v->size/4)){ + v->size /= 2; + v->data = realloc(v->data, v->size * sizeof(record_t)); + } +} + +void database_print(database_t* d){ + for(int i = 0; i < d->count; i++){ + print_record(d->data[i]); + printf("\n"); + } +} + +void database_free(database_t* d){ + free(d->data); + free(d); +} +*/ \ No newline at end of file diff --git a/record.h b/record.h index 00ca627f02f21fd83a40e4b57daa1a8fa063b112..14a2cd75c113c6165c8654565e11cb8cfa1fb77e 100644 --- a/record.h +++ b/record.h @@ -15,9 +15,21 @@ typedef struct _record{ date_t birth_date; }record_t; +typedef struct _database{ + record_t* data; + int size; + int count; +}database_t; + date_t create_date(uint16_t year, uint8_t month, uint8_t day); -record_t* create_record(date_t birth_date, char phone[10], char first_name[20], char last_name[20]); +record_t* create_record(uint16_t year, uint8_t month, uint8_t day, char phone[10], char first_name[20], char last_name[20]); record_t* record_prompt(); void print_record(record_t record); +database_t* create_database(); +void database_add(database_t* d, record_t* record); +void database_remove(database_t* v, int index); +void database_print(database_t* d); +void database_free(database_t* d); + #endif \ No newline at end of file