#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cmath>
using namespace std;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define Maxsize 100 //储存空间初始化分配量
#define SUCCESS 1
#define UNSUCCESS 0
#define HASHSIZE 12 //定义散列表长为数组的长度
#define NULLKEY -32768
typedef int Status;
typedef struct
{
int *elem; //数据元素储存基址,动态的分配内存
int cnt; //当前数据元素个数
}HashTable;
int m; // 散列表表长,全局变量
Status InitHashTable(HashTable *H)
{
int i;
m = HASHSIZE; //因为有HASHSIZE个元素
H->cnt = m;
H->elem = (int *)malloc(m*sizeof(int));
for(i=0;i<m;i++)
H->elem[i] = NULLKEY;//初始化
return OK;//表示初始化成功
}
int Hash(int key)
{
return key % m; //除留余数法
}
void InsertHash(HashTable *H,int key)
{
int addr = Hash(key); //求散列地址
while(H->elem[addr] != NULLKEY) //表明那个地方已经有值了,代表冲突了
{
addr = (addr + 1) % m; //找后面的空位插入
}
H->elem[addr] = key;//直到后面有空位插入
}
Status SearchHash(HashTable H,int key,int *addr)
{
*addr = Hash(key); //求散列地址
while(H.elem[*addr] != key)
{
*addr = (*addr + 1) % m;
if(H.elem[*addr] == NULLKEY || *addr == Hash(key)) //如果循环回到原点
{
return UNSUCCESS;
}
}
return SUCCESS;
}
int main()
{
int arr[HASHSIZE] = {12,67,56,16,25,37,22,29,15,47,48,34};
int i,p,key,result;
HashTable H;
key = 39;
InitHashTable(&H);
for(i=0;i<m;i++)
InsertHash(&H,arr[i]);
result = SearchHash(H,key,&p);
if(result)
cout<<"查找"<<key<<"的地址为"<<p<<endl;
else
cout<<"查到"<<key<<"失败"<<endl;
for(i=0;i<m;i++)
{
key = arr[i];
SearchHash(H,key,&p);
cout<<"查找"<<key<<"的地址为"<<p<<endl;
}
return 0;
}
哈希表(初步实现)
最新推荐文章于 2022-10-10 23:59:56 发布