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

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

#include
#include

#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;ielem[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,木有!");
}

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

你可能感兴趣的:(数据结构-C)