哈希表关键就是散列函数和冲突解决办法
散列函数构造有这几种(我知道的):
直接定址法、数字分析法、平方取中法、折叠法、除留余数法、随机数法
解决冲突的办法有这几种(我知道的):
开放定址法(本代码采用的办法)、再散列函数法、链地址法
全部代码如下
#include <iostream>
class Hash
{
public:
Hash();
int init_hash_table(); //初始化散列表
int hash(int key); //散列函数
int insert_hash(int key); //插入关键字到散列表
int search_hash(int key); //散列表查找关键字
private:
int count;
int *elem;
};
int main()
{
Hash hs;
hs.init_hash_table();
int key;
for (int i = 0; i < 5; ++i)
{
std::cout << "请输入要插入的关键字:" << std::endl;
std::cin >> key;
hs.insert_hash(key);
}
std::cout << "请输入要查找的关键字:" << std::endl;
std::cin >> key;
hs.search_hash(key);
return 0;
}
Hash::Hash() : count(0), elem(NULL)
{
;
}
int Hash::init_hash_table()
{
this->count = 7;
this->elem = new int[7];
for (int i = 0; i < 7; ++i)
{
elem[i] = -9999;
}
return 0;
}
int Hash::hash(int key)
{
return key % 7;
}
int Hash::insert_hash(int key)
{
int add = hash(key); //求散列地址
while (this->elem[add] != -9999) //如果要插入位置有东西
{
add = (add + 1) % 7; //采用开放定址法的线性测试
}
this->elem[add] = key; //将关键字插入
return 0;
}
int Hash::search_hash(int key)
{
int add = hash(key); //求散列地址
while (this->elem[add] != key) //如果不是要查找的关键字
{
add = (add + 1) % 7;
if (this->elem[add] == -9999 || add == hash(key)) //如果这位置没有元素 或者 找了一圈又回到了开头
{
std::cout << "error!\n" << std::endl;
return 1;
}
}
std::cout << "要查找的元素为" << elem[add] << "地址为" << add << std::endl;
return 0;
}