mirror of
https://github.com/sloven-c/hashmap.git
synced 2025-10-30 09:27:25 +01:00
Initial commit
This commit is contained in:
6
CMakeLists.txt
Normal file
6
CMakeLists.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
cmake_minimum_required(VERSION 4.0)
|
||||||
|
project(hashmap C)
|
||||||
|
|
||||||
|
set(CMAKE_C_STANDARD 23)
|
||||||
|
|
||||||
|
add_executable(hashmap main.c)
|
||||||
169
main.c
Normal file
169
main.c
Normal file
@@ -0,0 +1,169 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
struct HashMap {
|
||||||
|
char *key, *value;
|
||||||
|
struct HashMap *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct HashMap* init();
|
||||||
|
void deinit(struct HashMap *hashmap);
|
||||||
|
int insert(struct HashMap *hashmap, char *key, char *value);
|
||||||
|
int edit(struct HashMap *hashmap, const char *key, char *value);
|
||||||
|
int rem(struct HashMap **hashmap, const char *key);
|
||||||
|
char* get(const struct HashMap *hashmap, const char *key);
|
||||||
|
void print_all(const struct HashMap *hashmap);
|
||||||
|
int maplen(const struct HashMap *hashmap);
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
struct HashMap *dict = init();
|
||||||
|
insert(dict, "russia", "east");
|
||||||
|
insert(dict, "india", "south");
|
||||||
|
insert(dict, "slovenia", "center");
|
||||||
|
|
||||||
|
printf("Initial dictionary size: %d\n\n", maplen(dict));
|
||||||
|
|
||||||
|
printf("Printing all pairs:\n");
|
||||||
|
print_all(dict);
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
const char *key = "russia";
|
||||||
|
const char *value = get(dict, key);
|
||||||
|
if (value != NULL) printf("'%s' => '%s'\n\n", key, value);
|
||||||
|
|
||||||
|
const int res = rem(&dict, key);
|
||||||
|
if (!res) {
|
||||||
|
printf("Removal of key '%s' succeded. Current size %d\n", key, maplen(dict));
|
||||||
|
} else {
|
||||||
|
printf("Failed to remove the key '%s'\n", key);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *ekey = "india";
|
||||||
|
char *eval = "bharat";
|
||||||
|
printf("Attempting to change '%s' => '%s'\n", ekey, eval);
|
||||||
|
int eres = edit(dict, ekey, eval);
|
||||||
|
if (!eres) {
|
||||||
|
printf("Change successful!\n");
|
||||||
|
} else {
|
||||||
|
printf("Change failed!\n");
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
printf("Printing all pairs:\n");
|
||||||
|
print_all(dict);
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
deinit(dict);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct HashMap* init() {
|
||||||
|
struct HashMap* hashmap = malloc(sizeof(struct HashMap));
|
||||||
|
if (hashmap == NULL) {
|
||||||
|
fprintf(stderr, "Failed to allocate the memory to initialise hashmap");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
hashmap->key = nullptr;
|
||||||
|
hashmap->value = nullptr;
|
||||||
|
hashmap->next = nullptr;
|
||||||
|
|
||||||
|
return hashmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
void deinit(struct HashMap *hashmap) {
|
||||||
|
if (hashmap == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
deinit(hashmap->next);
|
||||||
|
free(hashmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
int insert(struct HashMap *hashmap, char *key, char *value) {
|
||||||
|
if (get(hashmap, key) != NULL) return 1;
|
||||||
|
bool found_null = false;
|
||||||
|
|
||||||
|
for (struct HashMap *it = hashmap; it != NULL; it = it->next) {
|
||||||
|
if (it->next == NULL) {
|
||||||
|
hashmap = it;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (it->key == NULL && it->value == NULL) {
|
||||||
|
hashmap = it;
|
||||||
|
found_null = true;
|
||||||
|
break; // we found an empty space
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (found_null) {
|
||||||
|
hashmap->key = key;
|
||||||
|
hashmap->value = value;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct HashMap *new_map = init();
|
||||||
|
new_map->key = key;
|
||||||
|
new_map->value = value;
|
||||||
|
hashmap->next = new_map;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int edit(struct HashMap *hashmap, const char *key, char *value) {
|
||||||
|
for (; hashmap != NULL; hashmap = hashmap->next) {
|
||||||
|
if (hashmap->key == key) {
|
||||||
|
hashmap->value = value;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int rem(struct HashMap **hashmap, const char *key) {
|
||||||
|
struct HashMap *it = *hashmap;
|
||||||
|
struct HashMap *prev = nullptr;
|
||||||
|
|
||||||
|
for (; it != NULL; it = it->next) {
|
||||||
|
if (it->key == key) {
|
||||||
|
// reassign prev pointer to next
|
||||||
|
if (prev != NULL) {
|
||||||
|
prev->next = it->next == NULL ? nullptr : it->next;
|
||||||
|
} else {
|
||||||
|
*hashmap = it->next; // set the caller pointer to point at the non-null element
|
||||||
|
}
|
||||||
|
// clear the pointer
|
||||||
|
free(it);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
prev = it;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1; // didn't find the pair
|
||||||
|
}
|
||||||
|
|
||||||
|
char* get(const struct HashMap *hashmap, const char *key) {
|
||||||
|
for (; hashmap != NULL; hashmap = hashmap->next) {
|
||||||
|
if (hashmap->key == key) {
|
||||||
|
return hashmap->value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_all(const struct HashMap *hashmap) {
|
||||||
|
for (; hashmap != NULL; hashmap = hashmap->next) {
|
||||||
|
printf("'%s': '%s'\n", hashmap->key, hashmap->value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int maplen(const struct HashMap *hashmap) {
|
||||||
|
int len = 0;
|
||||||
|
|
||||||
|
for (; hashmap != NULL; hashmap = hashmap->next) {
|
||||||
|
len++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user