Hash表技术:线性hash表类

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.实验结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值