哈希表(线性存储)+ 线性探测法解决哈希冲突:
将关键路径通过哈希函数映射到哈希表中,哈希表是线性的结构体数组,其中,线性存储中,哈希长度这里要提前给出,给出的长度一般是是大于插入数据数组的长度的最小素数。这里的长度不会变。
另外,这里解决哈希冲突采用的线性探测发。
代码如下:
#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;
}
程序运行如下::