#include < iostream >
#include < iomanip >
using namespace std;
#define NUM 12 // 元素个数
#define HASHSIZE 16 // 哈希表长度
#define MOD 13 // 哈希表可选地址
// 线性处理冲突
void collision(int &p,int c)
{
p = (p+1) % HASHSIZE;
}
//查询函数
int searchHash(int hs[],int key,int &p,int &c,void(*cp)(int &,int))
{
p = key % MOD;
while(hs[p]!=NULL && hs[p]!=key){ // 当对应位置不为空,且不为key时,冲突处理
cp(p,++c); // 冲突次数 c 加一
}
if(hs[p]==key){
return 1;
}
else if(hs[p]==0)
return 0;
}
// 插入函数
int insertHash(int hs[],int key)
{
int p,c=0; // c 保存冲突次数,p 保存元素的存储位置
if(searchHash(hs,key,p,c,collision)) {
return 0;
}
else if(c<HASHSIZE/2){
hs[p] = key;
return 1; // 插入成功
}
else return -1; // 其他情况异常插入失败
}
int main()
{
int hs[HASHSIZE] = {0};
int a[NUM] = {19,14,23,1,68,20,84,27,5,11,10,79};
for(int i=0;i<NUM;i++){ // 将每一个元素插入哈希表中
insertHash(hs,a[i]);
}
for(int i=0;i<HASHSIZE;i++){ // 依次将哈希表中的每一个位置的序号打印出来
cout<<setw(3)<<left<<i;
}
cout<<endl;
for(int i=0;i<HASHSIZE;i++){ // 依次将哈希表中的每一个位置的元素打印出来
cout<<setw(3)<<left<<hs[i];
}
cout<<endl;
return 0;
}