采用链表法解决哈希冲突的键值对映射表,可存储任意类型数据
ChainMap_M (Chain Map Multiple Data) 是一种采用链表法解决哈希冲突的 Map 数据结构。与 ChainMap_S 不同,它可以存储任意类型的 Key 和 Value,每个数据都自带 InfoOfData 操作集指针。
// ChainMap_M 中的 Entry 类型
typedef struct Entry_M_inChainMap {
Data_M key; // 键
Data_M value; // 值
bool isEmpty; // 是否为空
} Entry_M_inChainMap;
// ChainMap_M 链表节点
typedef struct Node_M_inChainMap {
struct Node_M_inChainMap* next;
struct Node_M_inChainMap* prev;
Entry_M_inChainMap entry;
} Node_M_inChainMap;
// ChainMap_M
typedef struct ChainMap_M {
List_M_inChainMap* arr; // 哈希桶数组
int mod; // 取模基数
int len; // 哈希桶数量
int size; // 元素数量
} ChainMap_M;
#include "base.h"
#include "Map/ChainMap/Multiple_Data/chainmap_mdata.h"
#include "Oper/String_Info/string_info.h"
#include "Oper/Int_Info/int_info.h"
int main() {
// 1. 初始化 Map
ChainMap_M map;
initMChainMap(&map);
// 2. 插入不同类型的键值对
int age = 25;
int score = 100;
// 字符串 key - 整数 value
insertMKeyAndMValInMChainMap(&map,
Data_M_OWN("age", NULL, &Info_String, 0),
Data_M_OWN(&age, NULL, &Info_Int, 0));
// 整数 key - 整数 value
insertMKeyAndMValInMChainMap(&map,
Data_M_OWN(1, NULL, &Info_Int, 0),
Data_M_OWN(&score, NULL, &Info_Int, 0));
// 3. 打印
printMChainMap(&map);
// 4. 释放
freeMChainMap(&map);
return 0;
}
初始化 ChainMap_M
pMap - ChainMap_M 的指针释放掉复制来的在 ChainMap_M 中的 MVal
inputData - MVal 类型指针 (Data_M 类型)释放掉复制来的在 ChainMap_M 中的 MEntry (Entry_M_inChainMap 类型)
entry - MEntry 类型 (Entry_M_inChainMap 类型)释放掉 ChainMap_M
pMap - ChainMap_M 的指针插入 key 和 val 到 ChainMap_M 类型中去
pMap - ChainMap_M 的指针key - MKey (Data_M 类型)val - MVal (Data_M 类型)通过 MKey 得到复制来的 MVal (Data_M 类型)
pMap - ChainMap_M 的指针key - MKey (Data_M 类型)通过 MKey 得到 MVal (Data_M 类型),可直接修改内部的 void* data 和 void* content 内容
pMap - ChainMap_M 的指针key - MKey (Data_M 类型)通过 MKey 得到复制来的 MEntry (Entry_M_inChainMap 类型)
pMap - ChainMap_M 的指针key - MKey (Data_M 类型)判断 Mkey 是否在 ChainMap_M 中
pMap - ChainMap_M 的指针key - MKey (Data_M 类型)通过 MKey 删除在 ChainMap_M 中的元素
pMap - ChainMap_M 的指针key - MKey (Data_M 类型)打印 ChainMap_M 中的所有数据
pMap - ChainMap_M 的指针打印在 ChainMap_M 中的 MKey (Data_M 类型)
keyData - MKey (Data_M 类型)打印在 ChainMap_M 中的 MVal (Data_M 类型)
valData - MVal (Data_M 类型)打印在 ChainMap_M 中的 MEntry (Entry_M_inChainMap 类型)
entry - MEntry (Entry_M_inChainMap 类型)#include <stdio.h>
#include "base.h"
#include "Map/ChainMap/Multiple_Data/chainmap_mdata.h"
#include "Oper/String_Info/string_info.h"
#include "Oper/Int_Info/int_info.h"
#include "Oper/Double_Info/double_info.h"
int main() {
// 初始化 Map
ChainMap_M map;
initMChainMap(&map);
// 准备数据
int age = 25;
double height = 175.5;
char name[] = "Tom";
// 插入异构数据
printf("=== 插入异构数据 ===\n");
insertMKeyAndMValInMChainMap(&map,
Data_M_OWN("age", NULL, &Info_String, 0),
Data_M_OWN(&age, NULL, &Info_Int, 0));
insertMKeyAndMValInMChainMap(&map,
Data_M_OWN("height", NULL, &Info_String, 0),
Data_M_OWN(&height, NULL, &Info_Double, 0));
insertMKeyAndMValInMChainMap(&map,
Data_M_OWN("name", NULL, &Info_String, 0),
Data_M_OWN(name, NULL, &Info_String, 0));
printMChainMap(&map);
// 查询
printf("\n=== 查询数据 ===\n");
Data_M val = getCopyMValByMKeyInMChainMap(&map,
Data_M_OWN("age", NULL, &Info_String, 0));
if (!val.isEmpty) {
printf("age: %d\n", *(int*)val.data);
freeMValInMChainMap(&val);
}
// 释放
freeMChainMap(&map);
return 0;
}
| 特性 | ChainMap_S | ChainMap_M |
|---|---|---|
| Key 类型 | 统一类型 | 可混合类型 |
| Value 类型 | 统一类型 | 可混合类型 |
| 初始化参数 | 需提供 keyInfo, valInfo | 无需参数 |
| 灵活性 | 较低 | 高 |
| 适用场景 | 同类键值对集合 | 异构数据、配置表 |