#define n 8
#define m 11
void InitHash(int HT[]) //构建哈希函数
{
int i;
for(i=0;i<m;i++)
HT[i]=0;
}
int Hash(int key) //哈希函数 除留余数法
{
return key%m;
}
void InserHash(int HT[],int key)
{
int h,d,s;
h=Hash(key); //计算哈希地址
while(HT[h]) //如果内容不是0,那么说明冲突,解决冲突
{
h=(h+1)%m;
}
HT[h]=key; //存放关键字
}
int SearchHash(int HT[],int key)
{
int sum=0,h,d;
h=Hash(key);
while(HT[h]!=key)
{
h=(h+1)%m;
sum++;
}
return sum;
}
int main()
{
int x[n]={22,41,53,46,30,13,1,67};
int ht[m],cs,sum,i;
InitHash(ht);
for(i=0;i<n;i++)
InserHash(ht,x[i]);
for(i=0;i<m;i++)
{
if(ht[i]!=0)
printf("i=%d %d \n",i,ht[i]);
}
printf("\n");
cs=0;
for(i=0;i<n;i++)
{
sum=SearchHash(ht,x[i]);
if(sum!=-1)
cs+=sum;
}
printf("cs=%d\n",cs);
printf("ASL=%f\n",(double)(cs)/n); //查找成功的概率为 查找成功的次数/元素的个数
return 0;
}
下面是结构体查找
#include<stdio.h>
#include<stdlib.h>
#include <malloc.h>
#define m 12
#define n 13
typedef struct {
int *elem;
int count;
}HashTable;
int initHash(HashTable *H)
{
H->count=n;
H->elem=(int *)malloc(n*sizeof(int));
if(!H->elem)
return -1;
int i;
for(i=0;i<n;i++)
{
H->elem[i]=0;
}
return 0;
}
int Hash(int key)
{
int h=key%n;
return h;
}
int insertHash(HashTable *H,int key)
{
int h,sum=0;
h=Hash(key);
while(H->elem[h])
{
h=(h+1)%n;
}
H->elem[h]=key;
return 0;
}
int searchHash(HashTable *H,int key,int *a)
{
int h=Hash(key),w=0;
while(H->elem[h]!=key)
{
h=(h+1)%n;
(*a)++;
w++;
if(w==n)
break;
}
if(w==n)
return -1;
return 0;
}
int main()
{
int i,a[m]={32,40,36,53,16,46,71,27,42,24,49,64},sum=0;
HashTable H;
initHash(&H);
for(i=0;i<m;i++)
{
insertHash(&H,a[i]);
}
for(i=0;i<n;i++)
{
if(H.elem[i])
printf("%d %d\n",i,H.elem[i]);
}
for(i=0;i<n;i++)
searchHash(&H,a[i],&sum);
printf("%d\n",sum);
double chenggong=(double)sum/m;
printf("%lf\n",chenggong);
return 0;
}