表和二叉树的排序,是利用元素之间的关系,逐个查找,或按一定的规律查找。
而散列表(哈希表),元素之间没有关系,它是利用了元素与存储地址之间的关系。
说白了,就是利用散列函数建立 元素->地址 的映射,然后在我们建立的结构体中,利用数组存储 地址->元素 的关系,来了个数据,用散列函数算一下他的地址,然后去数组里看看是不是这个元素,是就找到了,不是的话就拜拜了。
当然这里有一个地址冲突的问题,是个小细节。
#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,木有!");
}
以上是最基本的代码,是看《大话数据结构》时根据书上代码编写的,适合最最基础的人看,有问题可以评论,同是菜鸟,我们一起讨论嘛~