外链hash表达实现和操作

关于hash表,其实有很多,前面就介绍了一种,最为简单的线性hash表,还有一些,比如采用随机产生的hash码的hash表,还有增加一个溢出表达hash表,等等,人的精力总是有限的,对于那些暂时不用的,我们就不用去学,需要的时候再来看,所以我今天介绍一种,外链的hash表,因为,它是最常用和最有效的一种,非常类似,图的存储,所以拿过来,大家看看。

好了,依旧先上代码吧

#include<iostream>
using namespace std;
template <class T>
struct LHnode{
	T key;
	LHnode *next;
};

template <class T>
class Link_hash{
	private:
		int NN;
		LHnode<T> **LH;
	public:
		Link_hash(){NN=0;return;}
		Link_hash(int);
		void prt_Link_hash();
		void ins_Link_hash(int (*f)(T),T);
		LHnode<T>* sch_Link_hash(int (*f)(T),T);
		void del_Link_hash(int (*f)(T),T);
};

template <class T>
Link_hash<T>::Link_hash(int m){
	int k;
	NN=m;
	LH=new LHnode<T>*[NN];
	for(k=0;k<NN;k++)
		LH[k]=NULL;
	return;
}

template <class T>
void Link_hash<T>::prt_Link_hash(){
	int k;
	LHnode<T> *p;
	for(k=0;k<NN;k++){
	p=LH[k];
	cout<<k+1<<" ";
	if(p==NULL) cout<<"<NULL>";
	else
		while(p!=NULL){
		cout<<"  ---> ";
		cout<<p->key;
		p=p->next;
		}
		cout<<endl;
	}
	return;
}

template <class T>
void Link_hash<T>::ins_Link_hash(int (*f)(T),T x){
	int k;
	LHnode<T> *p;
	k=(*f)(x);
	p=new LHnode<T>;
	p->key=x;
	p->next=LH[k-1];
	LH[k-1]=p;
	return;
}

template <class T>
LHnode<T>* Link_hash<T>::sch_Link_hash(int (*f)(T),T x){
	int k;
	LHnode<T> *p;
	k=(*f)(x);
	p=LH[k-1];
	while((p!=NULL)&&(p->key!=x)) p=p->next;
	return p;
}

template <class T>
void Link_hash<T>::del_Link_hash(int (*f)(T),T x){
	int k;
	LHnode<T> *p,*q;
	k=(*f)(x);
	p=LH[k-1];q=NULL;
	while((p!=NULL)&&(p->key!=x)){
	q=p;p=p->next;
	}
	if(p==NULL) cout <<"No such element!"<<endl;
	else if(q!=NULL) q->next=p->next;
	else LH[k-1]=p->next;
	return;
}
它的具体应用如下

#include"Link_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;
	Link_hash<int> h(12);
	cout<<"input the element:"<<endl;
	for(k=0;k<12;k++)
		cout<<a[k]<<" ";
	cout<<endl;
	for(k=0;k<12;k++)
		h.ins_Link_hash(hashf,a[k]);
	cout<<"output the address of the element :"<<endl;
	h.prt_Link_hash();
	cout<<"search the element:"<<endl;
	for(k=0;k<12;k++)
		cout<<h.sch_Link_hash(hashf,a[k])<<" ";
	cout<<endl;
	h.del_Link_hash(hashf,2);
	cout<<"after delete 2 and output the element:"<<endl;
	h.prt_Link_hash();
	h.del_Link_hash(hashf,19);
	cout<<"after delete 19 and output the element:"<<endl;
	h.prt_Link_hash();
	return 0;
}
int hashf(int k){return (k/3+1);}
这种外链hash表就基本和图一样的实现,但是这里有很多细微的小操作,也就是所谓的细节,刚开始,编写完,错误一大堆,慢慢查慢慢找,才全部弄完,觉得有用的同学,可以拿过去看看。最后,附个结果图:



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值