/**********************************哈希查找*************************************/
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
#define HASHSIZE 20 /* 定义散列表长为数组的长度 */
#define NULLKEY -32768
//定义一个表示哈希表的结构体
typedef struct
{
int *elem; //数据元素存储地址,动态分配数组
int Total; //当前数据元素总个数
}HashTable;
int m=0; // 散列表表长,全局变量
/*初始化*/
/***函数1:
* 初始化哈希表
* @param hashTable 哈希表
*/
int Initate(HashTable *hashTable)
{
int i;
m=HASHSIZE;
hashTable->elem= (int *)malloc(m*sizeof(int)); //申请内存
hashTable->Total=m;
for (i=0;i<m;i++)
{
hashTable->elem[i]=NULLKEY;
}
}
/***函数2:
* 哈希函数(除留余数法),计算得到data对应的hash(key)
* @param data 存入的数据
*/
int Hash(int data)
{
return data%m;//除留余数法
}
/***函数3:
* 数据插入Hash表,若出现冲突,利用开放定址的线性探测法解决冲突
*
* @param hashTable 哈希表
* @param data 待插入的数据
*/
void Insert(HashTable *hashTable,int data)
{
int hashkey=Hash(data); //计算data对应的哈希地址
//发生冲突
while(hashTable->elem[hashkey]!=NULLKEY)//如果待插入的地方非空
{
//利用开放定址的线性探测法解决冲突
hashkey=(++hashkey)%m;
}
//插入值
hashTable->elem[hashkey]=data;
}
/***函数4:
* 数据插入Hash表
* @param *hashTable 哈希表的地址
* @param data 待查找的数据
*/
int Search(HashTable *hashTable,int data)
{
int hashkey=Hash(data); //求哈希地址
//发生冲突
while(hashTable->elem[hashkey]!=data)
{
//利用开放定址的线性探测法解决冲突
hashkey=(++hashkey)%m;
if (hashTable->elem[hashkey]==NULLKEY||hashkey==Hash(data)) return -1;//查找失败
}
//查找成功
return hashkey;//返回查找到的地址
}
/***函数5:
* 数据插入Hash表
*
* @param *hashTable 哈希表的地址
*/
/*打印结果*/
void Display(HashTable *hashTable)
{
int i;
cout<<"\n**********展示结果**********\n";
for (i=0;i<hashTable->Total;i++)
{
cout<< hashTable->elem[i]<<" ";
}
cout<<"\n**********展示完毕**********\n";
}
main()
{
int i,j,result,currentnum;
HashTable hashTable;
int arr[HASHSIZE]={13,29,27,28,26,30,38,213,2312,213,12,31,4,3,4,3214,12,34,1,23};
cout<<"***************哈希查找(C语言版)***************\n";
//初始化哈希表
Initate(&hashTable);
//插入数据
for (i=0;i<HASHSIZE;i++)
{
Insert(&hashTable,arr[i]);
}
Display(&hashTable);
//查找数据
cout<<"请输入待查找的数据的值"<<endl;
cin>>currentnum;
result= Search(&hashTable,currentnum);
if (result==-1)
cout<<"The data Is No Existing In The Hashtable!";
else
cout<<" The location of the data "<<currentnum<<" is: "<<result;
cout<<"\nPress any key to terminate the program....\n";
return 0;
}
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
#define HASHSIZE 20 /* 定义散列表长为数组的长度 */
#define NULLKEY -32768
//定义一个表示哈希表的结构体
typedef struct
{
int *elem; //数据元素存储地址,动态分配数组
int Total; //当前数据元素总个数
}HashTable;
int m=0; // 散列表表长,全局变量
/*初始化*/
/***函数1:
* 初始化哈希表
* @param hashTable 哈希表
*/
int Initate(HashTable *hashTable)
{
int i;
m=HASHSIZE;
hashTable->elem= (int *)malloc(m*sizeof(int)); //申请内存
hashTable->Total=m;
for (i=0;i<m;i++)
{
hashTable->elem[i]=NULLKEY;
}
}
/***函数2:
* 哈希函数(除留余数法),计算得到data对应的hash(key)
* @param data 存入的数据
*/
int Hash(int data)
{
return data%m;//除留余数法
}
/***函数3:
* 数据插入Hash表,若出现冲突,利用开放定址的线性探测法解决冲突
*
* @param hashTable 哈希表
* @param data 待插入的数据
*/
void Insert(HashTable *hashTable,int data)
{
int hashkey=Hash(data); //计算data对应的哈希地址
//发生冲突
while(hashTable->elem[hashkey]!=NULLKEY)//如果待插入的地方非空
{
//利用开放定址的线性探测法解决冲突
hashkey=(++hashkey)%m;
}
//插入值
hashTable->elem[hashkey]=data;
}
/***函数4:
* 数据插入Hash表
* @param *hashTable 哈希表的地址
* @param data 待查找的数据
*/
int Search(HashTable *hashTable,int data)
{
int hashkey=Hash(data); //求哈希地址
//发生冲突
while(hashTable->elem[hashkey]!=data)
{
//利用开放定址的线性探测法解决冲突
hashkey=(++hashkey)%m;
if (hashTable->elem[hashkey]==NULLKEY||hashkey==Hash(data)) return -1;//查找失败
}
//查找成功
return hashkey;//返回查找到的地址
}
/***函数5:
* 数据插入Hash表
*
* @param *hashTable 哈希表的地址
*/
/*打印结果*/
void Display(HashTable *hashTable)
{
int i;
cout<<"\n**********展示结果**********\n";
for (i=0;i<hashTable->Total;i++)
{
cout<< hashTable->elem[i]<<" ";
}
cout<<"\n**********展示完毕**********\n";
}
main()
{
int i,j,result,currentnum;
HashTable hashTable;
int arr[HASHSIZE]={13,29,27,28,26,30,38,213,2312,213,12,31,4,3,4,3214,12,34,1,23};
cout<<"***************哈希查找(C语言版)***************\n";
//初始化哈希表
Initate(&hashTable);
//插入数据
for (i=0;i<HASHSIZE;i++)
{
Insert(&hashTable,arr[i]);
}
Display(&hashTable);
//查找数据
cout<<"请输入待查找的数据的值"<<endl;
cin>>currentnum;
result= Search(&hashTable,currentnum);
if (result==-1)
cout<<"The data Is No Existing In The Hashtable!";
else
cout<<" The location of the data "<<currentnum<<" is: "<<result;
cout<<"\nPress any key to terminate the program....\n";
return 0;
}