🔣 ChainMap_M - 链表法哈希映射(多种数据类型)

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

📖 概述

ChainMap_M (Chain Map Multiple Data) 是一种采用链表法解决哈希冲突的 Map 数据结构。与 ChainMap_S 不同,它可以存储任意类型的 Key 和 Value,每个数据都自带 InfoOfData 操作集指针。

📌 特点

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

📋 函数列表

🔧 初始化与销毁

void initMChainMap(ChainMap_M* pMap)

初始化 ChainMap_M

参数:
  • pMap - ChainMap_M 的指针
void freeMValInMChainMap(Data_M* inputData)

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

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

释放掉复制来的在 ChainMap_M 中的 MEntry (Entry_M_inChainMap 类型)

参数:
  • entry - MEntry 类型 (Entry_M_inChainMap 类型)
void freeMChainMap(ChainMap_M* pMap)

释放掉 ChainMap_M

参数:
  • pMap - ChainMap_M 的指针

➕ 插入与查询

InfoOfReturn insertMKeyAndMValInMChainMap(ChainMap_M* pMap, Data_M key, Data_M val)

插入 key 和 val 到 ChainMap_M 类型中去

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

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

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

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

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

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

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

🔍 判存与删除

bool hasMKeyInMChainMap(ChainMap_M* pMap, Data_M key)

判断 Mkey 是否在 ChainMap_M 中

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

通过 MKey 删除在 ChainMap_M 中的元素

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

🖨️ 打印

void printMChainMap(ChainMap_M* pMap)

打印 ChainMap_M 中的所有数据

参数:
  • pMap - ChainMap_M 的指针
void printMKeyInMChainMap(Data_M keyData)

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

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

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

参数:
  • valData - MVal (Data_M 类型)
void printMEntryInMChainMap(Entry_M_inChainMap entry)

打印在 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 vs ChainMap_M

特性 ChainMap_S ChainMap_M
Key 类型 统一类型 可混合类型
Value 类型 统一类型 可混合类型
初始化参数 需提供 keyInfo, valInfo 无需参数
灵活性 较低
适用场景 同类键值对集合 异构数据、配置表

⚠️ 注意事项