散列表的查找过程
#define m<散列表长度>
#define NULLKEY<代表空记录的关键字值>
typedef int KeyType;
typedef struct
{
KeyType key;
}RecordType;
typedef RecordType HashTable[m];
int HashSearch(HashTable ht,KeyType K)
{
p0=hash(K);
if(ht[p0].key==NULLKEY)
return -1;
else if(ht[p0].key==K)
return p0;
else //用线性探测再散列解决冲突
{
for(i=1;i<=m-1;i++)
{
pi=(p0+i)%m;
if(ht[pi].key==NULLKEY)
return -1;
else if(ht[pi].key==K)
return pi;
}
return -1;
}
}
散列查找程序
//初始化原始数据和散列表数组,然后定义函数InserHash(),将一个数据从哈如到散列表中。
#include<stdio.h>
#define HASH_LEN 13
#define TABLE_LEN 8
int data[TABLE_LEN]={69,65,90,37,92,6,28,54}; //原数据
int hash[HASH_LEN]={0}; //散列表,初始化为0
void InserHash(int hash[],int m,int data) //将关键字data插入散列表hash中
{
int i;
i=data%13; //计算按散列地址
while(hash[i]) //元素位置已被占用
i=(++i)%m; //线性探测法解决冲突
hash[i]=data;
}
//定义函数CreateHash(),通过循环将数组中得原始添加到散列表中。
void CreateHash(int hash[],int m,int data[],int n)
{
int i;
for(i=0;i<n;i++) //循环将原始数据保存在散列表中
{
InserHash(hash,m,data[i]);
}
}
/*定义函数HashSearch(),来查找散列表中得指定元素。首先,根据散列表函数计算散列地址;然后,
判断散列地址是否冲突,有冲突则按照现行探测法向后查找;最后,根据是否查找成功输出结果*/
int HashSearch(int hash[],int m,int key)
{
int i;
i=key%13; //计算散列地址
while(hash[i]&&hash[i]!=key) //判断是否冲突
i=(++i)%m; //线性探测法解决冲突
if(hash[i]=0) //查找到开放单元,表示查找失败
return -1; //返回失败值
else //查找成功
return i; //返回对应元素的下标
}
int main()
{
int key,i,pos;
CreateHash(hash,HASH_LEN,data,TABLE_LEN); //调用函数创建散列表
printf("散列表各元素的值");
for(i=0;i<HASH_LEN;i++)
printf("%ld ",hash[i]);
printf("\n");
printf("输入查找关键字:");
scanf("%ld",&key);
pos=HashSearch(hash,HASH_LEN,key); //调用函数在散列表中查找
if(pos>0)
printf("查找成功,该关键字位于数组的第%d个位置。\n",pos);
else
printf("查找失败!\n");
return 0;
}