1. Hash表技术的基本思想是:对被查元素的关键字做某种运算后直接确定所要查找项目在表中位置。
2.线性Hash表类:Linear_hash.h
#include <iostream>
using namespace std;
//线性hash表结点类型
template <class T>
struct Hnode
{
int flag;//标志表项的空与非空
T key; //关键字
};
template <class T>
class Linear_hash
{
private:
int NN;//线性hash表长度
Hnode<T> * LH;//线性hash表存储空间的首地址
public:
Linear_hash(){NN=0;return;}
Linear_hash(int);//建立线性hash表存储空间
void prt_Linear_hash();//顺序输出线性hash表中元素
int flag_Linear_hash();//检测线性hash表中空项个数
void ins_Linear_hash(int (*f)(T),T);//在线性hash表中填入新数据
int search_Linear_hash(int (*f)(T),T);//在线性hash表中查找元素
};
//建立线性hash表存储空间
template <class T>
Linear_hash<T>::Linear_hash(int m)
{
int k;
NN=m;
LH=new Hnode<T>[NN];
for(k=0;k<NN;k++)
LH[k].flag=0;
return;
}
//顺序输出线性hash表中元素
template <class T>
void Linear_hash<T>::prt_Linear_hash()
{
int k;
for(k=0;k<NN;k++)
if(LH[k].flag==0)
cout<<"<null>"<<" ";
else
cout<<"<"<<LH[k].key<<">";
cout<<endl;
return;
}
//检测线性hash表中空项个数
template <class T>
int Linear_hash<T>::flag_Linear_hash()
{
int k,count=0;
for(k=0;k<NN;k++)
if(LH[k].flag==0)
count=count+1;
return(count);
}
//在线性hash表中填入新数据
template <class T>
void Linear_hash<T>::ins_Linear_hash(int (*f)(T),T x)
{
int k;
if(flag_Linear_hash()==0)
{
cout<<"线性hash表已满!"<<endl;return;
}
k=(*f)(x); //计算Hash码
while(LH[k-1].flag) //该项不空
{
k=k+1;
if(k==NN+1)k=1;
}
LH[k-1].key=x,LH[k-1].flag=1;//填入并置标志
return;
}
//在线性hash表中查找元素
template <class T>
int Linear_hash<T>::search_Linear_hash(int (*f)(T),T x)
{
int k;
k=(*f)(x);
while((LH[k-1].flag)&&(LH[k-1].key!=x))
{
k=k+1;
if(k==NN+1)k=1;
}
if((LH[k-1].flag)&&(LH[k-1].key==x)) //找到返回
return(k);
return(0); //表中没有这个关键字,返回
}
3.具体实现
#include "Linear_hash.h"
int hashf(int k);
int main()
{
int a[12]={9,31,26,19,1,13,2,11,27,16,5,21};
int k;
Linear_hash<int> h(12);
cout<<"输入的原序列:"<<endl;
for(k=0;k<12;k++)
cout<<a[k]<<" ";
cout<<endl;
for(k=0;k<12;k++)
h.ins_Linear_hash(hashf,a[k]);
cout<<"依次输出线性hash表中的关键字:"<<endl;
h.prt_Linear_hash();
cout<<"查找序列各个关键字在线性hash表中的位置(表项序号):"<<endl;
for(k=0;k<12;k++)
cout<<h.search_Linear_hash(hashf,a[k])<<" ";
cout<<endl;
return 0;
}
int hashf(int k)
{
return(k/3+1);
}
4.实验结果