mirror of
				https://github.com/sloven-c/hashmap.git
				synced 2025-11-04 11:27:23 +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