散列表

本文介绍了一种基于除留余数法的散列表实现,并详细解释了如何通过开放定址法解决冲突。提供了散列表的初始化、插入及查找操作的具体实现。

ACM模版

散列表

#define HASHSIZE 12
#define NULLKEY -32768

typedef struct
{
    int *elem;  //  数据元素的基址,动态分配数组
    int count;  //  当前数据元素的个数
} HashTable;

//  初始化哈希表<( ̄3 ̄)> 表!
int InitHashTable(HashTable *H)
{
    H->count = HASHSIZE;
    H->elem = (int *)malloc(HASHSIZE * sizeof(int));
    if (!H->elem)
    {
        return -1;  //  申请失败
    }
    for (int i = 0; i < HASHSIZE; i++)
    {
        H->elem[i] = NULLKEY;
    }
    return 0;
}

//  除留余数法生成哈希值
int Hash(int key)
{
    return key % HASHSIZE;
}

//  插入关键字到散列表
void InserHash(HashTable *H, int key)
{
    int addr;
    addr = Hash(key);
    while (H->elem[addr] != NULLKEY)    //  产生冲突
    {
        addr = (addr + 1) % HASHSIZE;   //  开放定址法线性探测
    }

    H->elem[addr] = key;
    return ;
}

//  散列表查找关键字
int SearchHash(HashTable H, int key, int *addr)
{
    *addr = Hash(key);

    while (H.elem[*addr] != key)        //  冲突则线性探测
    {
        *addr = (*addr + 1) % HASHSIZE;
        if (H.elem[*addr] == NULLKEY || *addr == Hash(key)) //  为空或者返回原位置
        {
            return 0;                   //  不存在
        }
    }
    return 1;                           //  存在,查找成功,结果存放在addr中
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值