map用c语言怎么写

在C语言中,没有内置的map数据结构,但我们可以使用结构体和指针来实现一个简单的map,下面是一个简单的示例,展示了如何使用C语言实现一个基于数组和链表的map。

map用c语言怎么写
(图片来源网络,侵删)

我们需要定义一个结构体来表示键值对:

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 != '