🔣 OAMap_M - 开放定址法哈希映射(多种数据类型)

采用开放定址法解决哈希冲突的键值对映射表,可存储任意类型数据

📖 概述

OAMap_M (Open Addressing Map Multiple Data) 是一种采用开放定址法解决哈希冲突的 Map 数据结构。与 OAMap_S 不同,它可以存储任意类型的 Key 和 Value,每个数据都自带 InfoOfData 操作集指针。

📌 特点

  • 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;
}

📋 函数列表

🔧 初始化与销毁

void initMOAMap(OAMap_M* pMap)

初始化 OAMap_M

参数:
  • pMap - OAMap_M 的指针
void freeMValInMOAMap(Data_M* inputData)

释放掉复制来的在 OAMap_M 中的 MVal

参数:
  • inputData - MVal 类型指针 (Data_M 类型)
void freeMEntryInMOAMap(Entry_M_inOAMap* entry)

释放掉复制来的在 OAMap_M 中的 MEntry (Entry_M_inOAMap 类型)

参数:
  • entry - MEntry 类型 (Entry_M_inOAMap 类型)
void freeMOAMap(OAMap_M* pMap)

释放掉 OAMap_M

参数:
  • pMap - OAMap_M 的指针

➕ 插入与查询

InfoOfReturn insertMKeyAndMValInMOAMap(OAMap_M* pMap, Data_M key, Data_M val)

插入 key 和 val 到 OAMap_M 类型中去

参数:
  • pMap - OAMap_M 的指针
  • key - MKey (Data_M 类型)
  • val - MVal (Data_M 类型)
返回: 返回 InfoOfReturn 中的枚举类型
Data_M getCopyMValByMKeyInMOAMap(OAMap_M* pMap, Data_M key)

通过 MKey 得到复制来的 MVal (Data_M 类型)

参数:
  • pMap - OAMap_M 的指针
  • key - MKey (Data_M 类型)
返回: 返回 Data_M 类型数据,若没有返回空 Data_M 类型数据,通过 Data.isEmpty 进行查看
注意: 返回的数据使用后需要调用 freeMValInMOAMap 释放
Data_M getPtrMValByMKeyInMOAMap(OAMap_M* pMap, Data_M key)

通过 MKey 得到 MVal (Data_M 类型),可直接修改内部的 void* data 和 void* content 内容

参数:
  • pMap - OAMap_M 的指针
  • key - MKey (Data_M 类型)
返回: 返回 Data_M 类型数据,若没有返回空 Data_M 类型数据,通过 Data.isEmpty 进行查看
警告: 返回的指针直接指向 Map 内部数据,请勿 free
Entry_M_inOAMap getCopyMEntryByKeyInMOAMap(OAMap_M* pMap, Data_M key)

通过 MKey 得到复制来的 MEntry (Entry_M_inOAMap 类型)

参数:
  • pMap - OAMap_M 的指针
  • key - MKey (Data_M 类型)
返回: 返回 Entry_M_inOAMap 类型数据,若没有返回空 Entry_M_inOAMap 类型数据,通过 entry.isEmpty 进行查看

🔍 判存与删除

bool hasKeyInMOAMap(OAMap_M* pMap, Data_M key)

判断 Mkey 是否在 OAMap_M 中

参数:
  • pMap - OAMap_M 的指针
  • key - MKey (Data_M 类型)
返回: 如果存在返回 true,否则返回 false
InfoOfReturn delMEntryByMKeyInMOAMap(OAMap_M* pMap, Data_M key)

通过 MKey 删除在 OAMap_M 中的元素

参数:
  • pMap - OAMap_M 的指针
  • key - MKey (Data_M 类型)
返回: 返回 InfoOfReturn 中的枚举类型

🖨️ 打印

void printMOAMap(OAMap_M* pMap)

打印 OAMap_M 中的所有数据

参数:
  • pMap - OAMap_M 的指针
void printMKeyInMOAMap(Data_M keyData)

打印在 OAMap_M 中的 MKey (Data_M 类型)

参数:
  • keyData - MKey (Data_M 类型)
void printMValInMOAMap(Data_M valData)

打印在 OAMap_M 中的 MVal (Data_M 类型)

参数:
  • valData - MVal (Data_M 类型)
void printMEntryInMOAMap(Entry_M_inOAMap entry)

打印在 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;
}

⚠️ 注意事项