散列技术就是在记录存储位置和它关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。
采用散列技术将记录存储在一块连续的存储空间中,这块存储空间称为散列表或哈希表,关键字对应的记录存储位置称为散列地址。
散列技术既是一种存储方法也是一种查找方法。
散列技术最适合的求解问题是查找和给定值相等的记录。
//散列表查找实现
#define SUCCESS 1
#define UNSUCCESS 0
#define HASHSIZE 12 //定义散列表长为数组长度
#define NULLKEY -32768
typedef struct
{
int *elem; //数据元素存储基址,动态分配数组
int count; //当前数据元素个数
}HashTable;
int m = 0; //散列表表长,全局变量
//初始化散列表
Status InitHashTable(HashTable *H)
{
int i;
m = HASHSIZE;
H->count = 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;
}