c实现哈希表_除余法

0.定义

哈希表是一种高效用来搜索的数据结构,传统查找方式每次查找都需要进行元素比较,性能高低取决于元素比较次数;理想搜索方法,可以不经过任何比较,一次直接从表中得到要搜索的数据。

构造一种存储结构,通过某种函数使元素的存储位置与它的关键码之间能够建立一对一映射的关系,那么查找时通过该函数就可以很快找到该元素。

1.除余法哈希表

1.1关键结构体

键值对结构体以及哈希表管理结构体

cpp 复制代码
// 键值对结构体
typedef struct pair{
    int key;
    char element[20];
}DATA,*LPDATA;//-> DATA = struct pair / LPDATA = struct pair*

// 哈希表管理结构体
typedef struct hashTable{
    LPDATA* table;
    int divisor; // 哈希表除数,哈希表长度
    int curSize;// 当前已插入多少有效元素
}HASH,*LPHASH;

1.2创建哈希表

1.创建哈希表,申请内存空间

2.键值对结构体分配内存空间

3.为开辟内存空间的键值对空间指向NULL

cpp 复制代码
LPHASH createHashTable(int p){
    LPHASH hash = (LPHASH)malloc(sizeof(HASH));// hash表内存分配
    assert(hash);
    hash->curSize = 0;
    hash->divisor = p;
    hash->table = (LPDATA*)malloc(sizeof(LPDATA)*hash->divisor);// 键值对内存分配
    assert(hash->table);
    for (int i = 0; i < hash->divisor; i++){
        hash->table[i] = NULL;
    }
    return hash;
}

1.3查找 key 应该存放的下标

1.确定待插入数据键在哈希表中的余数位置

2.到哈希表中确认位置,确认位置条件:2.1当前槽为空;2.2待插入数据键值与哈希表中当前位置键值相同,如果键值相同会进行覆盖

cpp 复制代码
int search(LPHASH hash,int key){
    int pos = key % hash->divisor;
    int curPos = pos;
    do{
        // 槽位为空 或者 当前槽位key 与 查找 key 相等,返回下标
        if (hash->table[curPos] == NULL || hash->table[curPos]->key == key){
            return curPos;
        }
        curPos = (curPos + 1) % hash->divisor;
    }while (curPos != pos);
    return curPos;
}

1.4插入数据

1.确认当前插入元素的下标

2.对当前哈希表下标位置进行判断:2.1如果为空哈希表当前位置开辟内存空间将待插入数据拷贝进去;2.2如果不为空判断哈希表中当前键值是否等于待插入数据键值,如果等于就覆盖,如果不等于说明表满了

cpp 复制代码
void insertData(LPHASH hash,DATA data){
    int pos = search(hash,data.key);
    if (hash->table[pos] == NULL){
        hash->table[pos] = (LPDATA)malloc(sizeof(DATA));
        memcpy(hash->table[pos],&data,sizeof(DATA));
        hash->curSize++;
    } else {
        if (hash->table[pos]->key == data.key){
            strcpy(hash->table[pos]->element,data.element);
        } else {
            printf("hash 表满了,无法插入\n");
            return;
        }
    }
}

1.5打印哈希表

遍历从第一个位置到除数个位置,打印哈希表中每一个位置的数据,如果没有数据就输出NULL

cpp 复制代码
void printHash(LPHASH hash){
    for (int i = 0; i < hash->divisor; i++){
        if (hash->table[i] == NULL){
            printf("NULL\n");
        } else {
            printf("%d:%s\n",hash->table[i]->key,hash->table[i]->element);
        }
    }
}

1.6哈希表测试demo

1.创建哈希表

2.向哈希表中插入数据

3.打印哈希表

cpp 复制代码
void task_hash_demo(void){
    LPHASH hash = createHashTable(10);
    DATA array[5] = {
        {1,"雷电"},
        {11,"春雨"},
        {23,"四月"},
        {44,"baby"},
        {56,"virtual"},
    };
    int num = sizeof(array) / sizeof(array[0]);
    for (int i = 0; i < num; i++){
        insertData(hash,array[i]);
    }
    printHash(hash);
}
相关推荐
free-elcmacom5 小时前
C语言指针进阶——指针数组模拟二维数组,以及二级指针到底怎么理解
c语言·visual studio code
山下梅子酒2256 小时前
洛谷-入门-B2049
c语言
剑指offer.8 小时前
嵌入式硬件-ARM芯片的启动
c语言·嵌入式硬件·嵌入式
Logic1019 小时前
C语言/数据结构动态规划题解:Kadane算法求最大子数组和——O(n)时间O(1)空间
c语言·数据结构·动态规划·贪心·时间复杂度·算法题·最大子数组和
雷✘10 小时前
C 程序从源文件到运行:预处理、编译、汇编、链接重定位与执行环境
c语言
Logic10110 小时前
C语言/数据结构位运算题解:异或XOR找出数据表中的“独特编号“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
endeavor1211 小时前
BootLoader与OTA学习(三)
c语言·stm32
布莱克60512 小时前
理解内存泄漏:成因、发现方法与解决策略(C++ 举例)
c语言·c++·内存泄漏
Logic10113 小时前
C语言/数据结构位运算题解:异或XOR找出英雄升级系统中的“独特经验值“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
Navigator_Z1 天前
LeetCode //C - 1252. Cells with Odd Values in a Matrix
c语言·算法·leetcode