开地址法
#include"iostream"
using namespace std;
int hkey(int key){
return key%13;
}
void ikey(int b[],int key,int a){
if(key<13){
if(b[key+1]==0){
b[key+1] = a;
}else{
ikey(b,key+1,a);
}
}
}
int main(){
int a[]={1,75,324,43,1353,90,46};
int b[20]={0};
for(int i =0;i<sizeof(a)/sizeof(a[0]);i++){
int key = hkey(a[i]);
if(b[key]==0){
b[key] = a[i];
}else{
int hash = a[i];
ikey(b,key,hash);
}
}
for(int j =0;j<sizeof(b)/4;j++){
cout<<b[j]<<" ";
}
}
拉链法
struct node{
int key,link;
};
int hkey(int key){
return key%13;
}
node table[13];
int main(){
int a[]={1,75,324,43,1353,90,46,103,116};
//往hashtable存数
for(int i=0;i<sizeof(a)/sizeof(a[1]);i++){
int key = hkey(a[i]);
if(table[key].key==0){
//所占单元为空
table[key].key = a[i];
table[key].link = -1;
// cout<<"table[key].key:"<<table[key].key<<" --a[i]"<<a[i]<<" key "<<key<<"\n";
}else{
//所占单元不为空
//无后继
int r = 12;
if(table[key].link==-1){
while(table[r].key!=0)r--;
table[r].key = a[i];
table[r].link = -1;
table[key].link = r;
}else{
int num = table[key].link;
cout<<table[num].link<<"table[num].link \n";
//有多个后继,
while(table[num].link!=-1&&table[num].link!=0){
//有后继
num = table[num].link;
}
int m=12 ;
while(table[m].key!=0)m--;
table[m].key = a[i];
table[m].link = -1;
table[num].link = m;
}
}
}
for(int i =0;i<13;i++){
cout<<table[i].key<<" ";
}
}