本篇,主要是哈希表有关的代码实现:
哈希表的创建
首先进行哈希表的初始化:
typedef struct //哈希表结构体
{
char data[19]; //内容
int times; //判断该位置是否有值,也可以通过data判断
}Hashtable;
Hashtable hash[30]; //哈希表
void InitHash() //哈希初始化
{
int i;
for(i=0;i<30;i++)
{
hash[i].times = 0;
strcpy(hash[i].data," ");
}
}
我们再接着用一种哈希算法来获取哈希函数值,在这里我用简单的取余法:
int HashFunc(int key) //取余
{
int a;
a=key%30;
return a;
}
在进行插入之前我们需要有查找函数,来判断所插入的内容所对应的哈希函数是否已经在哈希表中有对应的了,如果没有,放入哈希表,如果有,采用随机探测再散列法
int Collision(int di,int flag) //随机探测再散列
{
int a[10] = {2, 5, 9, 11, 13, 23, 16, 19, 15, 26};
int b;
b=(di+a[flag])%30;
return b;
}
int HashSearch(char *s) //查找
{
int index;
index=HashFunc(flod(s)); //取余后的
int num=-1;
while(strcmp(hash[index].data, s) != 0 && strcmp(hash[index].data, "") != 0) //如果哈希表非空或者哈希表存储值不同,则继续查找
{
index = Collision(index, ++num); //伪随机探测再散列,返回地址
}
if(strcmp(hash[index].data, s)==0)
{
return index;
}
else
{
return -1;
}
}
下来就是插入函数:
int HashInsert(char *s)//插入
{
int num=0;
int flag=HashSearch(s); //通过哈希查找判定是否插入过了
if(flag>=0)
{
return 0;
}
int index=HashFunc(flod(s)); //获取哈希函数值
if(hash[index].times==0) //如果这个位置没有值
{
strcpy(hash[index].data, s); //将s放入
hash[index].times=1; //这个位置的值标记为1
return 1;
}
else //如果这个位置有值的话
{
while(1)
{
index=Collision(index, num);
num++;
if(hash[index].times == 0)
{
strcpy(hash[index].data, s);
hash[index].times = 1;
return 1;
}
}
}
return -1;
}
还可以进行折叠等一些便于处理的函数,接下来是完整代码:
#include<stdio.h>
#include<string.h>
//#define HASHSIZE 30
typedef struct
{
char data[19];
int times;
}Hashtable;
Hashtable hash[35];
int flod(char *s) //折叠
{
int a=0;
int i;
for(i=0;s[i]!='\0';i++)
{
a=a+s[i];
}
return a;
}
int HashFunc(int key) //取余
{
int a;
a=key%30;
return a;
}
int Collision(int di,int flag) //随机探测再散列
{
int a[10] = {2, 5, 9, 11, 13, 23, 16, 19, 15, 26};
int b;
b=(di+a[flag])%30;
return b;
}
void InitHash() //哈希初始化
{
int i;
for(i=0;i<30;i++)
{
hash[i].times = 0;
strcpy(hash[i].data," ");
}
}
int HashSearch(char *s) //查找
{
int index;
index=HashFunc(flod(s)); //取余后的
int num=-1;
while(strcmp(hash[index].data, s) != 0 && strcmp(hash[index].data, "") != 0) //如果哈希表非空或者哈希表存储值不同,则继续查找
{
index = Collision(index, ++num); //伪随机探测再散列,返回地址
}
if(strcmp(hash[index].data, s)==0)
{
return index;
}
else
{
return -1;
}
}
int HashInsert(char *s)//插入
{
int num=0;
int flag=HashSearch(s); //通过哈希查找判定是否插入过了
if(flag>=0)
{
return 0;
}
int index=HashFunc(flod(s)); //获取哈希函数值
if(hash[index].times==0) //如果这个位置没有值
{
strcpy(hash[index].data, s); //将s放入
hash[index].times=1; //这个位置的值标记为1
return 1;
}
else //如果这个位置有值的话
{
while(1)
{
index=Collision(index, num);
num++;
if(hash[index].times == 0)
{
strcpy(hash[index].data, s);
hash[index].times = 1;
return 1;
}
}
}
return -1;
}
int main()
{
int i; //构建哈希表
InitHash(); //哈希表置为0
char a[30][19]= { "laaa", "lbbbbb", "lcccc", "lbbbb"};
for(i = 0; i < 30; i++)
{
HashInsert(a[i]);
}
char s[19];
printf("Please enter the name of the person you want to find:");
while(scanf("%s",&s) != EOF)
{
if(HashSearch(s) != -1)
{
printf("%s is a member of this class!\n",s);
printf("place:%d\n",HashSearch(s));
}
else
{
printf("%s is not in this class!\n",s);
}
printf("Please enter the name of the person you want to find:");
}
return 0;
}
运行结果为: