diff options
Diffstat (limited to 'hashmap.c')
-rw-r--r-- | hashmap.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/hashmap.c b/hashmap.c new file mode 100644 index 0000000..3d9edd0 --- /dev/null +++ b/hashmap.c @@ -0,0 +1,74 @@ +#include <string.h> +#include <stdlib.h> +#include <err.h> +#include "hashmap.h" + +struct node { + char *key; + void *value; + struct node *next; +}; + +struct hashmap *hashmap_new() { + struct hashmap *hm = malloc(sizeof *hm); + if (!hm) err(EXIT_FAILURE, "out of memory"); + for (int i=0; i < 26; i++) { + hm->buckets[i] = NULL; + } + + return hm; +} + +void hashmap_insert(struct hashmap *hm, char *key, void *value) { + int pos = (key[0] - 'a') % 26; + struct node *head = hm->buckets[pos]; + struct node *node = head; + + while (node) { + if (strcmp(node->key, key) == 0) { + node->value = value; + return; + } + node = node->next; + } + + node = malloc(sizeof *node); + node->key = key; + node->value = value; + node->next = head; + hm->buckets[pos] = node; +} + +void *hashmap_get(struct hashmap *hm, char *key) { + int pos = (key[0] - 'a') % 26; + struct node *node = hm->buckets[pos]; + while (node) { + if (strcmp(node->key, key) == 0) { + return node->value; + } + + node = node->next; + } + + return NULL; +} + +void hashmap_remove(char *key) { + +} + +void hashmap_free(struct hashmap *hm) { + struct node *node; + struct node *next; + + for (int i=0; i < 26; i++) { + node = hm->buckets[i]; + while (node) { + next = node->next; + free(node); + node = next; + } + } + + free(hm); +}
\ No newline at end of file |