关于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表就基本和图一样的实现,但是这里有很多细微的小操作,也就是所谓的细节,刚开始,编写完,错误一大堆,慢慢查慢慢找,才全部弄完,觉得有用的同学,可以拿过去看看。最后,附个结果图: