采用开放定址法解决哈希冲突的键值对映射表,可存储任意类型数据
OAMap_M (Open Addressing Map Multiple Data) 是一种采用开放定址法解决哈希冲突的 Map 数据结构。与 OAMap_S 不同,它可以存储任意类型的 Key 和 Value,每个数据都自带 InfoOfData 操作集指针。
// OAMap_M 中的 Entry 类型
typedef struct Entry_M_inOAMap {
Data_M key; // 键
Data_M value; // 值
int state; // 状态
bool isEmpty; // 是否为空
} Entry_M_inOAMap;
// OAMap_M
typedef struct OAMap_M {
Entry_M_inOAMap* arr; // 哈希槽数组
int mod; // 取模基数
int len; // 槽位数量
int size; // 元素数量
} OAMap_M;
#include "base.h"
#include "Map/OAMap/Multiple_Data/oamap_mdata.h"
#include "Oper/String_Info/string_info.h"
#include "Oper/Int_Info/int_info.h"
int main() {
// 1. 初始化 Map
OAMap_M map;
initMOAMap(&map);
// 2. 插入不同类型的键值对
int age = 30;
int id = 1001;
// 字符串 key - 整数 value
insertMKeyAndMValInMOAMap(&map,
Data_M_OWN("age", NULL, &Info_String, 0),
Data_M_OWN(&age, NULL, &Info_Int, 0));
// 整数 key - 整数 value
insertMKeyAndMValInMOAMap(&map,
Data_M_OWN(1, NULL, &Info_Int, 0),
Data_M_OWN(&id, NULL, &Info_Int, 0));
// 3. 打印
printMOAMap(&map);
// 4. 释放
freeMOAMap(&map);
return 0;
}
初始化 OAMap_M
pMap - OAMap_M 的指针释放掉复制来的在 OAMap_M 中的 MVal
inputData - MVal 类型指针 (Data_M 类型)释放掉复制来的在 OAMap_M 中的 MEntry (Entry_M_inOAMap 类型)
entry - MEntry 类型 (Entry_M_inOAMap 类型)释放掉 OAMap_M
pMap - OAMap_M 的指针插入 key 和 val 到 OAMap_M 类型中去
pMap - OAMap_M 的指针key - MKey (Data_M 类型)val - MVal (Data_M 类型)通过 MKey 得到复制来的 MVal (Data_M 类型)
pMap - OAMap_M 的指针key - MKey (Data_M 类型)通过 MKey 得到 MVal (Data_M 类型),可直接修改内部的 void* data 和 void* content 内容
pMap - OAMap_M 的指针key - MKey (Data_M 类型)通过 MKey 得到复制来的 MEntry (Entry_M_inOAMap 类型)
pMap - OAMap_M 的指针key - MKey (Data_M 类型)判断 Mkey 是否在 OAMap_M 中
pMap - OAMap_M 的指针key - MKey (Data_M 类型)通过 MKey 删除在 OAMap_M 中的元素
pMap - OAMap_M 的指针key - MKey (Data_M 类型)打印 OAMap_M 中的所有数据
pMap - OAMap_M 的指针打印在 OAMap_M 中的 MKey (Data_M 类型)
keyData - MKey (Data_M 类型)打印在 OAMap_M 中的 MVal (Data_M 类型)
valData - MVal (Data_M 类型)打印在 OAMap_M 中的 MEntry (Entry_M_inOAMap 类型)
entry - MEntry (Entry_M_inOAMap 类型)#include <stdio.h>
#include "base.h"
#include "Map/OAMap/Multiple_Data/oamap_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
OAMap_M map;
initMOAMap(&map);
// 准备数据
int age = 25;
double score = 95.5;
char name[] = "Alice";
// 插入异构数据
printf("=== 插入异构数据 ===\n");
insertMKeyAndMValInMOAMap(&map,
Data_M_OWN("age", NULL, &Info_String, 0),
Data_M_OWN(&age, NULL, &Info_Int, 0));
insertMKeyAndMValInMOAMap(&map,
Data_M_OWN("score", NULL, &Info_String, 0),
Data_M_OWN(&score, NULL, &Info_Double, 0));
insertMKeyAndMValInMOAMap(&map,
Data_M_OWN("name", NULL, &Info_String, 0),
Data_M_OWN(name, NULL, &Info_String, 0));
printMOAMap(&map);
// 查询
printf("\n=== 查询数据 ===\n");
Data_M val = getCopyMValByMKeyInMOAMap(&map,
Data_M_OWN("age", NULL, &Info_String, 0));
if (!val.isEmpty) {
printf("age: %d\n", *(int*)val.data);
freeMValInMOAMap(&val);
}
// 释放
freeMOAMap(&map);
return 0;
}