HashMap.h
#pragma once
#define N 10
typedef char* K;
typedef char* V;
typedef struct node {
K key;
V val;
struct node* next;
} Node;
typedef struct {
Node* table[N];
} HashMap;
HashMap* hashmap_create();
void hashmap_destroy(HashMap* map);
V hashmap_put(HashMap* map, K key, V val);
V hashmap_get(HashMap* map, K key);
void hashmap_delete(HashMap* map, K key);
HashMap.c
#include "HashMap.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
unsigned int hash(char* str) {
unsigned int hash = 1315423911;
while (*str) {
hash ^= ((hash << 5) + (*str++) + (hash >> 2));
}
return (hash & 0x7FFFFFFF);
}
HashMap* hashmap_create() {
return calloc(1, sizeof(HashMap));
}
void hashmap_destroy(HashMap* map) {
// free所有结点
for (int i = 0; i < N; i++) {
// 遍历每条链表
Node* curr = map->table[i];
while (curr != NULL) {
Node* next = curr->next;
free(curr);
curr = next;
}
}
// free HashMap结点
free(map);
}
// 如果key不存在,则添加(key, val);
// 如果存在, 则更新键值对, 并返回原来关联的值
V hashmap_put(HashMap* map, K key, V val) {
int idx = hash(key) % N;
// 遍历链表
Node* curr = map->table[idx];
while (curr != NULL) {
// 相等
if (strcmp(curr->key, key) == 0) {
V retValue = curr->val;
curr->val = val;
return retValue;
}
// 不相等
curr = curr->next;
}
// 添加结点
Node* newNode = malloc(sizeof(Node));
if (newNode == NULL) {
printf("malloc failed in hashmap_put\n");
exit(1);
}
// 头插法
newNode->key = key;
newNode->val = val;
newNode->next = map->table[idx];
map->table[idx] = newNode;
return NULL;
}
V hashmap_get(HashMap* map, K key) {
int idx = hash(key) % N;
// 遍历链表
Node* curr = map->table[idx];
while (curr != NULL) {
if (strcmp(curr->key, key) == 0) {
return curr->val;
}
curr = curr->next;
}
return NULL;
}
void hashmap_delete(HashMap* map, K key) {
int idx = hash(key) % N;
// 遍历链表
Node* prev = NULL;
Node* curr = map->table[idx];
while (curr != NULL) {
if (strcmp(curr->key, key) == 0) {
// 删除curr指向的结点
if (prev == NULL) {
map->table[idx] = curr->next;
free(curr);
}
else {
prev->next = curr->next;
free(curr);
}
return;
}
prev = curr;
curr = curr->next;
}
}
main.c
#include "HashMap.h"
#include <stdlib.h>
int main(void) {
HashMap* map = hashmap_create(); // 空的HashMap
hashmap_put(map, "liuqiangdong", "zhangzetian");
hashmap_put(map, "wangbaoqiang", "marong");
hashmap_put(map, "jianailiang", "lixiaolu");
hashmap_put(map, "wenzhang", "mayili");
// hashmap_put(map, "wangbaoqiang", NULL);
// hashmap_put(map, "jianailiang", NULL);
// hashmap_put(map, "wenzhang", NULL);
// char* str = hashmap_get(map, "wenzhang");
// puts(str);
// str = hashmap_get(map, "peanut");
// puts(str);
hashmap_delete(map, "liuqiangdong");
hashmap_delete(map, "peanut");
hashmap_destroy(map);
return 0;
}