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);
}
相关推荐
小雨笙笙4 小时前
C语言:变量三属性——存储类型
c语言·开发语言
Navigator_Z5 小时前
LeetCode //C - 1192. Critical Connections in a Network
c语言·算法·leetcode
布莱克6056 小时前
理解 C/C++ 中的 void* 指针
c语言·c++
(initial)6 小时前
C-05. Kernel Fusion 代价边界:少写回 vs 寄存器压力与 occupancy
c语言·开发语言·cuda
不正经学生8 小时前
C语言字符串函数进阶:安全版函数 + 错误处理 + 子串查找
c语言·开发语言·c++·算法·面试
看浪的路人10 小时前
第2讲:一致性哈希——数据分片与负载均衡
算法·哈希算法
不正经学生13 小时前
C语言大小端字节序:内存里字节的排列顺序
c语言·开发语言·arm开发·c++·算法·c#
动词ing13 小时前
【C语言】命名规范
c语言·开发语言
YSL07012414 小时前
数据在内存中的存储
c语言
SNAKEpc1213814 小时前
OpenGL(十三)- Mip贴图
c语言·c++·图形渲染·贴图