【Data_Structure笔记10】查找算法之【哈希查找或散列表查找法】

#include<iostream>

using namespace std;

#define HASH_LENGTH  13
#define TABLE_LENGTH 8


int srcData[TABLE_LENGTH] = {56,68,92,39,95,62,29,55};               //【1】原始数据
int hashTable[HASH_LENGTH]= {0};                                     //【2】哈希表,初始化为0

/***************************************************************************************************************************
模块说明:
        将关键字data插入到哈希表中
***************************************************************************************************************************/
template<typename ElemType>void HashInsert(ElemType hashTable[],int iMod,ElemType data)
{
	int hashAdd = data%HASH_LENGTH;                                   //【1】计算哈希地址
	while(hashTable[hashAdd])                                         //【2】如果元素的位置已经被占用,则利用冲突的解决方法
	{
		hashAdd = (++hashAdd)%iMod;                                    //【3】利用【线性探测再散列】法解决冲突
	}
	hashTable[hashAdd] = data;                                         //【4】找到合适的位置,则将元素进行插入

}
/***************************************************************************************************************************
模块说明:
        创建哈希表
***************************************************************************************************************************/
template<typename ElemType>void CreateHashTable(ElemType hashTable[],int iMod,ElemType data[],int iLength)
{
	for(int i=0;i<iLength;i++)                                         //【1】循环将原始数据插入到哈希表中
	{
		HashInsert<int>(hashTable,iMod,data[i]);                       //【2】调用哈希表的插入函数
	}
}
/***************************************************************************************************************************
模块说明:
        哈希查找算法
***************************************************************************************************************************/
template<typename ElemType>int HashSearch(ElemType hashTable[],int iMod,ElemType key)
{
	int iHashAdd = key%HASH_LENGTH;                                    //【1】计算哈希地址
	while(hashTable[iHashAdd]&&hashTable[iHashAdd]!=key)               //【2】判断地址是否有冲突
	{
		iHashAdd = (++iHashAdd)%iMod;
	}
	if(hashTable[iHashAdd]==0)                                          //【3】如果查找到开放地址,查找失败
	{
		return -1;
	}
	else
	{
		return iHashAdd;                                               //【4】查找成功,则返回对应元素的下标
	}
}
/***************************************************************************************************************************
模块说明:
        控制台应用程序的入口地址
***************************************************************************************************************************/
int main(int argc,char* argv[])
{
	CreateHashTable<int>(hashTable,HASH_LENGTH,srcData,TABLE_LENGTH);  //【1】调用函数创建哈希表 
	std::cout<<"【NOTICE】哈希表中各元素的值:"<<std::endl;
	for(int i=0;i<HASH_LENGTH;i++)
	{
		std::cout<<"【"<<i<<"】"<<hashTable[i]<<std::endl;
	}
	int iPos = HashSearch<int>(hashTable,HASH_LENGTH,92);
 
	std::cout<<iPos<<std::endl;

    if(iPos>0)
        printf("查找成功,该关键字位于数组的第%d个位置。\n",iPos);
    else
        printf("查找失败!\n");
	std::system("pause");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值