在C语言中,没有内置的map数据结构,但我们可以使用结构体和指针来实现一个简单的map,下面是一个简单的示例,展示了如何使用C语言实现一个基于数组和链表的map。
(图片来源网络,侵删)
我们需要定义一个结构体来表示键值对:
typedef struct KeyValuePair { char *key; void *value; struct KeyValuePair *next; } KeyValuePair;
接下来,我们定义一个结构体来表示map:
typedef struct Map { KeyValuePair **buckets; int size; int count; } Map;
在这个结构体中,buckets
是一个指针数组,用于存储键值对。size
表示每个桶的大小,count
表示当前map中的键值对数量。
现在,我们可以实现一些基本的map操作,如初始化、插入、查找和删除:
#include <stdlib.h> #include <string.h> #include <stdio.h> Map *map_create(int size) { Map *map = (Map *)malloc(sizeof(Map)); map>buckets = (KeyValuePair **)calloc(size, sizeof(KeyValuePair *)); map>size = size; map>count = 0; return map; } void map_destroy(Map *map) { for (int i = 0; i < map>size; i++) { KeyValuePair *pair = map>buckets[i]; while (pair) { KeyValuePair *next = pair>next; free(pair>key); free(pair); pair = next; } } free(map>buckets); free(map); } void map_put(Map *map, const char *key, void *value) { unsigned int hash = hash_string(key) % map>size; KeyValuePair *pair = map>buckets[hash]; while (pair) { if (strcmp(pair>key, key) == 0) { pair>value = value; return; } pair = pair>next; } pair = (KeyValuePair *)malloc(sizeof(KeyValuePair)); pair>key = strdup(key); pair>value = value; pair>next = map>buckets[hash]; map>buckets[hash] = pair; map>count++; } void *map_get(Map *map, const char *key) { unsigned int hash = hash_string(key) % map>size; KeyValuePair *pair = map>buckets[hash]; while (pair) { if (strcmp(pair>key, key) == 0) { return pair>value; } pair = pair>next; } return NULL; }
这里,我们使用了一个非常简单的哈希函数hash_string
来计算键的哈希值,你可以根据需要替换为更复杂的哈希函数,我们还需要一个方法来释放键和值的内存:
void free_value(void *value) { if (value == NULL) { return; } if (value == strdup("")) { // special case for empty string free((char *)value); return; } else if (strchr((char *)value, '"')) { // special case for strings with quotes and backslashes in them (JSON format) char *temp = (char *)value; while (*temp != '