Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2020
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.59 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <stdlib.h>
  4.  
  5. typedef struct SNode TNode;
  6.  
  7. typedef struct SNode {
  8.     void* key;
  9.     void* value;
  10.  
  11.     TNode* next;
  12. } TNode;
  13.  
  14. typedef struct SHashMap {
  15.     TNode** nodes;
  16.     uint32_t (*hash)(void*);
  17.     char (*cmpr)(void*, void*);
  18.     size_t nodes_count;
  19.     size_t nodes_size;
  20. } THashMap;
  21.  
  22.  
  23. THashMap* HashMap_create(size_t init_size, uint32_t (*hash)(void*), char (*cmpr)(void*, void*)) {
  24.     static int use_count = 0;
  25.     ++use_count;
  26.  
  27.     THashMap* hash_map;
  28.     hash_map = malloc(sizeof(*hash_map));
  29.     hash_map->hash = hash;
  30.     hash_map->cmpr = cmpr;
  31.     hash_map->nodes = malloc(sizeof(*(hash_map->nodes)) * init_size);
  32.     for (size_t i = 0; i < init_size; ++i) {
  33.         hash_map->nodes[i] = NULL;
  34.     }
  35.     hash_map->nodes_count = 0;
  36.     hash_map->nodes_size = init_size;
  37.     return hash_map;
  38. }
  39.  
  40. void HashMap_add(THashMap* hash_map, void* key, void* value) {
  41.     uint32_t idx = hash_map->hash(key) % hash_map->nodes_size;
  42.  
  43.     TNode* new_node;
  44.     new_node = malloc(sizeof(*new_node));
  45.     new_node->key = key;
  46.     new_node->value = value;
  47.    
  48.     new_node->next = hash_map->nodes[idx];
  49.     hash_map->nodes[idx] = new_node;
  50. }
  51.  
  52. TNode* HashMap_find(THashMap* hash_map, void* key) {
  53.     uint32_t idx = hash_map->hash(key) % hash_map->nodes_size;
  54.     TNode* current_node = hash_map->nodes[idx];
  55.  
  56.     while (current_node) {
  57.         if (hash_map->cmpr(key, current_node->key)) {
  58.             return current_node;
  59.         }
  60.         current_node = current_node->next;
  61.     }
  62.     return NULL;
  63. }
  64.  
  65. void* HashMap_get(THashMap* hash_map, void* key) {
  66.     TNode* node = HashMap_find(hash_map, key);
  67.     return (node ? node->value : NULL);
  68. }
  69.  
  70. void HashMap_remove(THashMap* hash_map, void* key) {
  71.     uint32_t idx = hash_map->hash(key) % hash_map->nodes_size;
  72.     TNode* current_node = hash_map->nodes[idx];
  73.     TNode* prev_node = NULL;
  74.    
  75.     if (!hash_map->nodes[idx])
  76.         return;
  77.    
  78.     if (hash_map->cmpr(key, hash_map->nodes[idx]->key)) {
  79.         TNode* node_to_delete = hash_map->nodes[idx];
  80.         hash_map->nodes[idx] = node_to_delete->next;
  81.         free(node_to_delete);
  82.         return;
  83.     }
  84.  
  85.     while (current_node) {
  86.         if (hash_map->cmpr(key, current_node->key)) {
  87.             prev_node->next = current_node->next;
  88.             free(current_node);
  89.             return;
  90.         }
  91.  
  92.         prev_node = current_node;
  93.         current_node = current_node->next;
  94.     }
  95. }
  96.  
  97.  
  98. void HashMap_delete(THashMap* hash_map) {
  99.     for (size_t i = 0; i < hash_map->nodes_size; ++i) {
  100.         TNode* current_node = hash_map->nodes[i];
  101.         while (current_node) {
  102.             TNode* next_node = current_node->next;
  103.             free(current_node);
  104.             current_node = next_node;
  105.         }
  106.     }
  107.     free(hash_map->nodes);
  108.     free(hash_map);
  109. }
  110.  
  111. uint32_t hash_int(void* key) {
  112.     int* int_key = (int*) key;
  113.     return (*int_key) * 127167 + 1951;
  114. }
  115.  
  116. char cmpr_int(void* key1, void* key2) {
  117.     return *((int*) key1) == *((int*) key2);
  118. }
  119.  
  120. int main() {
  121.     THashMap* hash_map = HashMap_create(100, &hash_int, &cmpr_int);
  122.  
  123.     int key1 = 5; char value1[] = "SOsite PidOr1";
  124.     HashMap_add(hash_map, &key1, value1);
  125.     int key2 = 105; char value2[] = "I am cute string";
  126.     HashMap_add(hash_map, &key2, value2);
  127.  
  128.     int key3 = 105;
  129.     printf("key = %d, value = %s\n", key3, (char*) HashMap_get(hash_map, &key3));
  130.     HashMap_remove(hash_map, &key3);
  131.     if (!HashMap_get(hash_map, &key3)) {
  132.         printf("Key %d is not found\n", key3);
  133.     }
  134.  
  135.     HashMap_delete(hash_map);
  136.     return 0;
  137. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement