//开放寻址法//散列函数包括线性探测、二次探测、双重探测#includeusing namespace std;//除法散列法int h1(int k,int m){ return k%m; }//乘法散列法int h2(int k,int m,float A){ float fnum=(float)k; float re=((fnum*A)-(int)(fnum*A))*m; return (int)re;}//全域散列法,p为质数int h3(int k,int p,int m){ int a,b; a=11; b=13; return ((a*k+b)%p)%m;}//线性探查int LinerProbing(int k,int m,int i){ return (h1(k,m)+i)%m;}//二次探查int QuadraticProbing(int k,int m,int i){ int c1=17,c2=67; return (h1(k,m)+c1*i+c2*i*i)%m;}//双重探查int DoublefunProbing(int k,int m,int i){ return (h3(k,17,m)+i*h1(k,m))%m;}//插入值为k的元素到具有m个槽的T中int Insert(int *T,int k,int m){ int i=1,j; while(1) { //利用双重探查得出插入位置 j=DoublefunProbing(k,m,i); if(i==m+1) { break; } //T[j]==-1表示该槽为空 if(T[j]==-1) { T[j]=k; return j; } i++; } return -1;}//删除值为k的元素在具有m个槽的T中bool Delete(int *T,int k,int m){ int i=1,j; while(1) { j=DoublefunProbing(k,m,i); if(i==m+1) { return 0; } if(T[j]==-1) { return 0; } if(T[j]==k) { T[j]=-1; return 1; } i++; }}//搜索值为k的元素在具有m个槽的T中int Search(int *T,int k,int m){ int i=1,j; while(1) { j=DoublefunProbing(k,m,i); if(i==m+1) { return -1; } if(T[j]==-1) { return -1; } if(T[j]==k) { return j; } i++; }}int main(){ int a[10]={4,8,2,6,41,21,53,496,3216,48}; int T[101]={0}; int i; for(i=0;i<101;i++) { T[i]=-1; } for(i=0;i<10;i++) { Insert(T,a[i],100); } for(i=1;i<=100;i++) { if(T[i]!=-1) { cout< <<" "; } } cout< < < < <
Reference
[1].http://m.blog.csdn.net/blog/liuzhanchen1987/7799257#