哈希表是不用通过比较数值的查找方法,相当便利,建立了数值与存储地址的联系,但是everything都不可能那么完美,它存在冲突,解决冲突的方法:线性探测、那个平方(就是1的平方,-1的平方,2的平方,-2的平方.....)还有一个随机数法,但我觉的前两种更靠谱,
上代码了!
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define NULLKEY -32768
int mod;
typedef struct
{
int *elem;
int count;
}Hashtable;
int InitHashtable(Hashtable *H,int m) 哈希表初始化
{
H->elem=(int*)malloc(m*sizeof(int));
for(int i=0;i<m;i++)
H->elem[i]=NULLKEY;
return 0;
}
int Hash(int e)
{
return e%mod;
}
int InsertHash(Hashtable *H,int k) 插入哈希表
{
int t=Hash(k);
while(H->elem[t]!=NULLKEY)
{
t=(t+1)%mod;
if(t==Hash(k)) 已经探测一圈了,还是没有车位,无奈啊!
{
cout<<"哈希表已满!"<<endl;
return 0;
}
}
H->elem[t]=k;
return 0;
}
int SearchHash(Hashtable *H,int k) 搜索哈希表
{
int t=Hash(k);
while(H->elem[t]!=k)
{
t=(t+1)%mod;
if(t==NULLKEY||t==Hash(k)) 如果找到空的地方了,但是他不是k,说明哈希表原来没有此值;第二个是探测一圈了,未找到
{
cout<<"未找到!"<<endl;
return -1;
}
}
return t;
}
int main()
{
Hashtable T;
int i,j,m,n;
cout<<"请输入你要插入哈希表元素的数目及mod:"<<endl;
cin>>m>>j;
mod=j;
InitHashtable(&T,m);
for(i=0;i<m;i++)
{
cin>>n;
InsertHash(&T,n);
}
for(i=0;i<m;i++)
cout<<T.elem[i]<<" ";
cout<<endl;
cout<<"输入你要查找的值:"<<endl;
cin>>n;
if(SearchHash(&T,n)!=-1)
cout<<"他在哈希表第"<<SearchHash(&T,n)+1<<"个位置"<<endl;
return 0;
}