采用开放定址法解决哈希冲突的键值对映射表,存储单一类型数据
OAMap_S (Open Addressing Map Single Data) 是一种采用开放定址法(Open Addressing)解决哈希冲突的 Map 数据结构。当发生冲突时,它会探测其他可用的槽位来存储数据。
// OAMap_S 中的 Entry 类型
typedef struct Entry_S_inOAMap {
Data_S key; // 键
Data_S val; // 值
int state; // 状态:存在/已删除/空
bool isEmpty; // 是否为空
} Entry_S_inOAMap;
// OAMap_S
typedef struct OAMap_S {
Entry_S_inOAMap* arr; // 哈希槽数组
int mod; // 取模基数
int len; // 槽位数量
int size; // 元素数量
InfoOfData* keyInfo; // key 操作集
InfoOfData* valInfo; // value 操作集
} OAMap_S;
#include "base.h"
#include "Map/OAMap/Single_Data/oamap_sdata.h"
#include "Oper/String_Info/string_info.h"
#include "Oper/Int_Info/int_info.h"
int main() {
// 1. 初始化 Map
OAMap_S map;
initSOAMap(&map, &Info_String, &Info_Int);
// 2. 插入键值对
insertSkeyAndSValInSOAMap(&map,
Data_S_OWN("id", NULL),
Data_S_OWN(1001, NULL));
insertSkeyAndSValInSOAMap(&map,
Data_S_OWN("level", NULL),
Data_S_OWN(99, NULL));
// 3. 查找
Data_S val = getCopySValBySkeyInSOAMap(&map, Data_S_OWN("id", NULL));
if (!val.isEmpty) {
printf("id: %d\n", *(int*)val.data);
}
// 4. 打印
printSOAMap(&map);
// 5. 释放
freeSOAMap(&map);
return 0;
}
初始化 OAMap_S
pMap - OAMap_S 的指针keyInfo - key 的 InfoOfData 类型指针valInfo - val 的 InfoOfData 类型指针释放掉复制来的在 OAMap_S 中的 SVal
pMap - OAMap_S 的指针inputData - SVal 类型指针 (Data_S 类型)释放掉复制来的在 OAMap_S 中的 SEntry (Entry_S_inOAMap 类型)
pMap - OAMap_S 的指针entry - SEntry 类型 (Entry_S_inOAMap 类型)释放掉 OAMap_S
pMap - OAMap_S 的指针插入 key 和 val 到 OAMap_S 类型中去
pMap - OAMap_S 的指针key - 传入的 key (Data_S 类型数据)val - 传入的 val (Data_S 类型数据)通过 SKey 得到复制来的 SVal (Data_S 类型)
pMap - OAMap_S 的指针key - 传入的 key (Data_S 类型数据)通过 SKey 得到 SVal (Data_S 类型),可直接修改内部的 void* data 和 void* content 内容
pMap - OAMap_S 的指针key - 传入的 key (Data_S 类型数据)通过 SKey 得到复制来的 SEntry (Entry_S_inOAMap 类型)
pMap - OAMap_S 的指针key - 传入的 key (Data_S 类型数据)判断 Skey 是否在 OAMap_S 中
pMap - OAMap_S 的指针key - 传入的 key (Data_S 类型数据)通过 SKey 删除在 OAMap_S 中的元素
pMap - OAMap_S 的指针key - 传入的 key (Data_S 类型数据)打印 OAMap_S 中的所有数据
pMap - OAMap_S 的指针打印在 OAMap_S 中的 SKey (Data_S 类型)
pMap - OAMap_S 的指针keyData - SKey (Data_S 类型)打印在 OAMap_S 中的 SVal (Data_S 类型)
pMap - OAMap_S 的指针valData - SVal (Data_S 类型)打印在 OAMap_S 中的 SEntry (Entry_S_inOAMap 类型)
pMap - OAMap_S 的指针entry - SEntry (Entry_S_inOAMap 类型)#include <stdio.h>
#include "base.h"
#include "Map/OAMap/Single_Data/oamap_sdata.h"
#include "Oper/String_Info/string_info.h"
#include "Oper/Int_Info/int_info.h"
int main() {
// 初始化 Map
OAMap_S map;
initSOAMap(&map, &Info_String, &Info_Int);
// 插入数据
printf("=== 插入数据 ===\n");
insertSkeyAndSValInSOAMap(&map,
Data_S_OWN("name", NULL),
Data_S_OWN(1, NULL));
insertSkeyAndSValInSOAMap(&map,
Data_S_OWN("age", NULL),
Data_S_OWN(25, NULL));
insertSkeyAndSValInSOAMap(&map,
Data_S_OWN("city", NULL),
Data_S_OWN(3, NULL));
printSOAMap(&map);
// 查询
printf("\n=== 查询数据 ===\n");
Data_S val = getCopySValBySkeyInSOAMap(&map, Data_S_OWN("age", NULL));
if (!val.isEmpty) {
printf("age: %d\n", *(int*)val.data);
freeSValInSOAMap(&map, &val);
}
// 判断存在
printf("\n是否存在 country: %s\n",
hasSKeyInSOAMap(&map, Data_S_OWN("country", NULL)) ? "是" : "否");
// 删除
printf("\n=== 删除数据 ===\n");
delSEntryBySKeyInSOAMap(&map, Data_S_OWN("city", NULL));
printSOAMap(&map);
// 释放
freeSOAMap(&map);
return 0;
}