哈希表(线性存储)+ 线性探测法解决哈希冲突

哈希表(线性存储)+ 线性探测法解决哈希冲突:

将关键路径通过哈希函数映射到哈希表中,哈希表是线性的结构体数组,其中,线性存储中,哈希长度这里要提前给出,给出的长度一般是是大于插入数据数组的长度的最小素数。这里的长度不会变。

另外,这里解决哈希冲突采用的线性探测发。

代码如下:

#include <stdio.h>
#define max 50
#define nuldata -1
#define deledata -2
typedef struct{
	int ino; //哈希编号 
	int data;//存放数据 
	int count;//探索次数 
}hashstable;//哈希表结构体类型 

//向哈希表中插入数据 
void inserthash(hashstable hash[],int x, int m)//求长度
{
	int i;
	int adr;
	adr = x%m; //取模求出哈希编号 

    //这里是设定了哈希编号的数据data为空或者为删除过的编号(删除过data的值是-2)	
	if(hash[adr].data == nuldata || hash[adr].data == deledata)
	{
		hash[adr].data = x;
		hash[adr].count++;
	}
	else{
	   i = 0;
	   do{
	   	    adr = (adr+1)%m;
	   	    i++; //i用来求探测数
			    
            if(i == m) 
            {
            	printf("哈希表已满,插入失败");
            	break;
			}
	   }while(hash[adr].data!=nuldata && hash[adr].data!=deledata);
	   hash[adr].data =x;
	   hash[adr].count = i;
	}
}

//创建哈希表
void createhash(hashstable hash[], int hs[], int n,int m)//n表示插入的个数,m表示哈希的长度 
{
	//初始化 
	for(int i =0; i<m; i++)
	{
		hash[i].ino =i;
		hash[i].data = nuldata;
		hash[i].count = 0;
	}
	
	//对每个数插入哈希表中 
	for(int i =0; i<n; i++)
	{
		inserthash(hash,hs[i],m);
	}
} 

//查询关键字的位置的哈希信息 
int  searchhash(hashstable hash[],int m,int k)
{
	int adr = k%m;
	
	while(hash[adr].data!=nuldata && hash[adr].data!=deledata && hash[adr].data!=k)
	{
		adr = (adr+1)%m;
	}
    if(hash[adr].data == k)  return adr;
    else return -1;
 }  
 
 //删除关键子 
 void delehash(hashstable hash[],int m,int k)
 {
 	int adr;
 	adr = searchhash(hash,m,k); //先查询 
 	
 	if(adr!=-1)
 	{
 		hash[adr].data = deledata;
 		hash[adr].count = 0;
 		printf("操作成功\n");
	 }
  } 
  
//输出哈希表的相关信息 
void showhash(hashstable hash[], int m)
{
	
	printf("哈希表的地址: ");
	for(int i =0; i<m; i++)
	{
		printf("%-4d",i);
	 } 
	 printf("\n");
	 
	 printf("哈希表关键字: ");
	 for(int i =0; i<m; i++)
	 {
	 	if(hash[i].data==nuldata || hash[i].data == deledata)
	 	{
	 		printf("空   ");
		 }
		 else  printf("%-4d",hash[i].data);
	 }
	 printf("\n");
	 
	 printf("探测次数:      ");
	 for(int i=0; i<m; i++)
	 {
		 printf("%-4d",hash[i].count);
	 }
}

 
int main()
{
	int hs[] ={16,74,60,43,54,90,46,31,29,88,77};
	int n =11, m = 13;
	hashstable hash[max];
	createhash(hash,hs,n,m);
	showhash(hash,m);
	printf("\n");
	
	
	int adr = searchhash(hash,m,77);
	printf("\n查找77的哈希信息:  "); 
	printf("hs[%d].%d :%d", adr,hash[adr].data,hash[adr].count);
	printf("\n");
	
	
	printf("\n删除值为77的哈希信息: ");
	delehash(hash,m,77);
	printf("\n");
	showhash(hash,m);
	
	
	printf("\n");
	printf("\n插入值为50的哈希信息: ");
	
	
	inserthash(hash,50,m);
	adr = searchhash(hash,m,50);
	if(adr!=-1)
	{
		printf("插入成功!\n"); 
		printf("插入50的哈希信息:");
		printf("hs[%d].%d :%d", adr,hash[adr].data,hash[adr].count);
	}
	else{
		printf("插入失败");
	}
	
	printf("\n");
	printf("\n"); 
	showhash(hash,m);
	
	return 0; 
 } 

程序运行如下:
在这里插入图片描述

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值