数据结构---C语言简单实现哈希表

这篇博客介绍了哈希表的两种冲突解决方法——闭散列(线性探测)和开散列(拉链法)。在闭散列中,当发生哈希冲突时,新数据会沿着一定的规律寻找空槽存储。而在开散列中,通过拉链法建立单链表解决冲突,使得每个哈希地址可以对应多个关键字值。博客详细讲解了这两种方法的实现代码和操作过程,包括哈希表的初始化、插入、删除和查找操作。
摘要由CSDN通过智能技术生成

当你看这篇的时候我认为你已经懂得哈希表的基本原理和一些具体方法实现了,如果你是想清晰的理解哈希表原理,点这个哈希表(散列表)原理详解


闭散列

  • 我们往哈希表中插入数据时往往会发生哈希冲突,即两个不一样的 key 通过散列函数求出的下标 offset 是一样的,这时候就要给后插入的数据重新找位置,就诞生了两种形式,闭散列和开散列
  • 闭散列又称线性探测,即如果当前往哈希表中插入数据产生哈希冲突,就需要把新插入的数据另辟地方存储。
  • 举个例子:把哈希表看成是摆成一排的一个一个的箱子,箱子中存放的是数据,当我们往目标箱子中放新数据时,发现该箱子中已经有数据了,那就看看它旁边箱子中空着没,空着的话就存进去数据,没空的话就再扩大范围找,不过这个范围和规律要自己定义,不是随随便便的放。
  • 我这里采用的方法是如果发现所求下标 offset 处已经有数据了,则 offset++ 往后探测,直到找到空箱子。
代码以及解释
  • 结构体声明
//键值对
typedef int KeyType;
typedef int ValueType;
//哈希函数指针
typedef int (*HashFunc)(KeyType key);

//哈希表中元素的状态
typedef enum State{
    EMPTY,//当前点是空的
    VALUE,//当前点是有元素的
    DELETED//当前点已被删除,也可以当做空了
}State;
//将键值对存放于结构体中
typedef struct KeyValue{
    KeyType key;
    ValueType value;
    State state;
}KeyValue;
//哈希表
typedef struct HashTable{
    KeyValue data[HashMaxSize];
    size_t size;
    HashFunc func;
}HashTable;

  • 初始化哈希表和销毁哈希表
//哈希函数(取余散列法)
int HashFunction(KeyType key)
{
    return key % HashMaxSize;
}

//哈希表初始化
void HashInit(HashTable* ht ,HashFunc func)
{
    if(ht == 0)
    {
        //非法输入
        return;
    }
    ht->size = 0;
    ht->func = func;
    size_t i = 0;
    for(; i < HashMaxSize; i++)
    {
        ht->data[i].state = EMPTY;
    }
}
//销毁哈希表
void HashDestroy(HashTable* ht)
{
    if(ht == 0)
    {
        return;
    }
    ht->size = 0;
    ht->func = NULL;
}
  • 插入和删除操作

这里写图片描述

//往哈希表中插入数据
void HashInsert(HashTable* ht, KeyType key, ValueType value)
{
    if(ht == NULL
  • 6
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值