mirror of
				https://github.com/sloven-c/hashmap.git
				synced 2025-10-30 17:37: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