哈希表1

1. 初始化
void HashInit(HashTable* ht, HashFunc func)
{
    if(ht == NULL || func == NULL)
    {
        return;
    }
    ht -> size = 0;
    ht -> func = func;
    int i = 0;
    for(; i < HashMaxSize; i++)
    {
        ht -> data[i].state = Empty;
    }
}
2. 哈希表的销毁
void HashDestroy(HashTable* ht)
{
    if(ht == NULL)
    {
        return;
    }
    ht -> size = 0;
    ht -> func = NULL;
    size_t i = 0;
    for(; i < HashMaxSize; i++)
    {
        ht -> data[i].state = Empty;
    }
}
3. 哈希表的插入
void HashInsert(HashTable* ht, ValueType key, KeyType value)
{
    if(ht == NULL)
    {
        return;
    }
    //判断是否可以插入, 此处的负载因子规定为 0.8
    if(ht -> size >= 0.8 * HashMaxSize)
    {
        return;
    }
    int offset = ht -> func(key);
    while(1)
    {
        //插入的基本思路就是按照插入成功, 插入失败, 插入冲突处理
        if(ht -> data[offset].state != Valid)
        {
            ht -> data[offset].key = key;
            ht -> data[offset].value = value;
            ht -> data[offset].state = Valid;
            ++ht -> size;
            return;
        }
        else if(ht -> data[offset].state == Valid && ht -> data[offset].key == key)
        {
            //此处认为插入的值在哈希表中已经存在, 就认为插入失败
            return;
        }
        else
        {
            ++offset;
            if(offset >= HashMaxSize)
            {
                offset = 0;
            }
        }
    }
}
4. 哈希表的查找
int HashFind(HashTable* ht, KeyType key, ValueType* value)
{
    if(ht == NULL || value == NULL)
    {
        return 0;
    }
    if(ht -> size == 0)
    {
        return 0;
    }
    //根据当前的 key 值计算出偏移量
    size_t offset = ht -> func(key);
    while(1)
    {
        //如果当前的 key 和 key 相同, 就直接返回 value
        if(ht -> data[offset].key == key && ht ->data[offset].state == Valid)
        {
            *value = ht -> data[offset].value;
            return 1;
        }
        //如果探测失败就认为没有找到
        if(ht -> data[offset].state == Empty)
        {
            return 0;
        }
        //如果当前的 key 和需要查找的 key 不同, 就先行探测
        else if(ht -> data[offset].key != key)
        {
            offset++;
            if(offset >= HashMaxSize)
            {
                offset = 0;
            }
        }
    }
    return 0;
}
5. 哈希表的删除
void HashRemove(HashTable* ht, KeyType key)
{
    if(ht == NULL)
    {
        return;
    }
    if(ht -> size == 0)
    {
        return;
    }
    size_t offset = ht -> func(key);
    while(1)
    {
        if(ht -> data[offset].key == key && ht -> data[offset].state == Valid)
        {
            //找到了要删除的元素
            ht -> data[offset].state = Deleted;
            --ht -> size;
            return;
        }
        else if(ht -> data[offset].state == Empty)
        {
            return;//说明没有找到要删除的元素
        }
        else
        {
            offset++;
            if(offset >= HashMaxSize)
            {
                offset = 0;
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值