HashTable

开地址法

#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<<"  "; 
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值