详解哈希表(下)

本篇,主要是哈希表有关的代码实现:

哈希表的创建

首先进行哈希表的初始化:

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;

}

运行结果为:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值