哈希查找(数据结构作业),这里只列举了线性探测法,还有二次探测法(左右摆头),链地址法可以自行理解,如有错误请及时指出
/*
第七章查找数据结构作业
date:2021/12/10
content:哈希查找实现(线性探测法处理冲突)
mind:
1.创建哈希表
2.核心代码是线性探测,向右顺位思想,走到尾无位置,再从头开始顺位
测试用例为课本232页第5题
散列表的地址范围为0-17,散列函数为H(key)=key%16
已存入关键字序列:(10,24,32,17,31,30,46,47,40,63,49)
直接输入search_key即可查找
*/
#include <iostream>
using namespace std;
#define len 18
#define m 16
typedef struct{
int key;
int compare;
}HashTable;
HashTable a[len];
int data[11]={10,24,32,17,31,30,46,47,40,63,49};
//创建哈希表
void CreateHash(){
for(int i=0;i<11;i++){
int H0 = data[i] % m;
if(a[H0].key==0){
a[H0].key=data[i];
a[H0].compare=1;
}
else{
for(int j=1;j<m;j++){
int Hj = (H0+j) % len;
if(a[Hj].key==0){
a[Hj].key=data[i];
a[Hj].compare=j+1;
break;
}
}
}
}
}
//哈希查找
int SearchHash(HashTable HT[len],int search_key){
int H0 = search_key % m;
if(HT[H0].key==0) return -1;
else if(HT[H0].key==search_key) return H0;
else{
for(int i=1;i<m;i++){
int Hi = (H0+i) % len;
if(HT[Hi].key==0) return -1;
else if(HT[Hi].key==search_key) return Hi;
}
return -1;
}
}
int main()
{
CreateHash();
int search_key;
cin>>search_key;
int b = SearchHash(a,search_key);
if(b!=-1){
cout<<"search_key的散列地址为:"<<b<<endl;
cout<<"查找search_key需要比较次数为:"<<a[b].compare;
}else{
cout<<"未查找到该数据";
}
return 0;
}