散列表查找(哈希表)的基本操作 (完整代码)

表和二叉树的排序,是利用元素之间的关系,逐个查找,或按一定的规律查找。
而散列表(哈希表),元素之间没有关系,它是利用了元素与存储地址之间的关系。
说白了,就是利用散列函数建立 元素->地址 的映射,然后在我们建立的结构体中,利用数组存储 地址->元素 的关系,来了个数据,用散列函数算一下他的地址,然后去数组里看看是不是这个元素,是就找到了,不是的话就拜拜了。
当然这里有一个地址冲突的问题,是个小细节。

#include<stdio.h>
#include<stdlib.h>

#define SUCCESS 1
#define UNSUCCESS 0
#define HASHSIZE 12
#define NULLKEY -32768

int m=0;

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

//初始化
int InitHashTable(HashTable *H)
{
    int i;
    m=HASHSIZE;
    H->count=m;
    H->elem=(int*)malloc(m*sizeof(int));        //动态分配
    for(i=0;i<m;i++)
        H->elem[i]=NULLKEY;
    return SUCCESS;
}

//散列函数
int Hash(int key)
{
    return key%m;
}

//插入
void InsertHash(HashTable *H,int key)
{
    int addr=Hash(key);
    while(H->elem[addr]!=NULLKEY)       //若该地址非空,则冲突
        addr=(addr+1)%m;        //冲突处理:开放地址法的线性探测
    H->elem[addr]=key;
}

//查找
int SearchHash(HashTable H,int key,int *addr)
{
    *addr=Hash(key);        //求其散列地址
    while(H.elem[*addr]!=key)       //该地址不为空,则冲突
    {
        *addr=(*addr+1)%m;      //线性探测
        if(H.elem[*addr]==NULLKEY || *addr==Hash(key))      //若循环回到原点,说明该元素不存在
            return UNSUCCESS;
    }
    return SUCCESS;
}

void main()
{
    HashTable H;
    int i,key;
    int addr;
    InitHashTable(&H);
    int a[12]={12,67,56,16,25,37,22,29,15,47,48,34};
    for(i=0;i<12;i++)
    {
        InsertHash(&H,a[i]);
    }
    printf("请输入你要查找的元素:");
    scanf("%d",&key);
    if(SearchHash(H,key,&addr))
        printf("有的哦");
    else
        printf("sorry,木有!");
}

以上是最基本的代码,是看《大话数据结构》时根据书上代码编写的,适合最最基础的人看,有问题可以评论,同是菜鸟,我们一起讨论嘛~

  • 6
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值