diff --git a/ex2/ex2.c b/ex2/ex2.c index 7456deb7f1350b9879e8f00c298c29cb95bd4a65..ea722ac695b2e643cb221a68136ac21b547744e5 100644 --- a/ex2/ex2.c +++ b/ex2/ex2.c @@ -9,13 +9,14 @@ * */ -#include <math.h> -#include <stdbool.h> -#include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> +#define KEY_MAXIMUM_LENGTH 4 +#define HASH_MAP_LENGTH 10 +#define VECTOR_DEFAULT_CAPACITY 100 + typedef struct Entry { char *key; double value; @@ -32,6 +33,92 @@ typedef struct HashMap { Vector **entries; } HashMap; +/** + * @brief Hashes a string. + * + * @param key + * @param length + * @return int + */ +int hash(char key[4], int length); + +/** + * @brief Initializes an entry. + * + * @param key + * @param value + * @return Entry* + */ +Entry *entry_init(char *key, double value); + +/** + * @brief Frees the memory of the entry. + * + * @param e + */ +void entry_destroy(Entry *e); + +/** + * @brief Initializes an vector. + * + * @param capacity + * @return Vector* + */ +Vector *vector_init(int capacity); + +/** + * @brief Frees the memory of the vector. + * + * @param e + */ +void vector_destroy(Vector *v); + +/** + * @brief Adds an element at the end of the vector. + * + * @param v + * @param e + */ +void vector_push(Vector *v, Entry *e); + +/** + * @brief Displays the vector. + * + * @param v + */ +void vector_print(Vector *v); + +/** + * @brief Initializes an hash map. + * + * @param length + * @return HashMap* + */ +HashMap *hash_map_init(int length); + +/** + * @brief Frees the memory of the hash map. + * + * @param dict + */ +void hash_map_destroy(HashMap *dict); + +/** + * @brief Inserts the value in the hash map. + * + * @param dict + * @param key + * @param value + */ +void hash_map_insert(HashMap *dict, char *key, double value); + +/** + * @brief Displays the hash map. + * + * @param dict + */ +void hash_map_print(HashMap *dict); + int hash(char key[4], int length) { int index = 0; for (int i = 0; i < 4; ++i) { @@ -42,12 +129,15 @@ int hash(char key[4], int length) { Entry *entry_init(char *key, double value) { Entry *e = (Entry *)malloc(sizeof(Entry)); - e->key = key; + e->key = (char *)malloc(sizeof(char) * (KEY_MAXIMUM_LENGTH + 1)); + e->key[0] = '\0'; + strcpy(e->key, key); e->value = value; return e; } void entry_destroy(Entry *e) { + free(e->key); free(e); } @@ -89,7 +179,7 @@ HashMap *hash_map_init(int length) { dict->entries = (Vector **)malloc(sizeof(Vector *) * dict->length); for (int i = 0; i < length; i += 1) { - dict->entries[i] = vector_init(100); + dict->entries[i] = vector_init(VECTOR_DEFAULT_CAPACITY); } return dict; @@ -115,7 +205,6 @@ void hash_map_insert(HashMap *dict, char *key, double value) { } } - // string copy Entry *e = entry_init(key, value); vector_push(v, e); } @@ -129,7 +218,8 @@ void hash_map_print(HashMap *dict) { } int main() { - HashMap *dict = hash_map_init(10); + HashMap *dict = hash_map_init(HASH_MAP_LENGTH); + hash_map_insert(dict, "ajku", 1.1); hash_map_insert(dict, "ajkv", 2.2); hash_map_insert(dict, "ajkw", 3.1); @@ -142,10 +232,11 @@ int main() { hash_map_insert(dict, "bjkd", 1.9); hash_map_print(dict); + printf("\n"); + hash_map_insert(dict, "ajkt", 0.1); hash_map_insert(dict, "ajku", 9.1); hash_map_insert(dict, "ajkx", 2.9); - printf("\n"); hash_map_print(dict); hash_map_destroy(dict);