建立Hash表(散列表)(运用线性探测法解决冲突)
来源:互联网 发布:2017最新淘宝黑车技术 编辑:程序博客网 时间:2024/05/16 02:00
//根据用户输入的表长度、散列函数的模、以及若干个健值(个数小于表长度, 有效关键字不为0)建立Hash表
//使用线性探测法解决冲突
#include<iostream>
using namespace std;
const int NULLKEY = 0;
const int ENDFLAG = 0;
const int TableSize = 16;
const int mod = 13;
typedef int KeyType;
typedef char InfoType;
typedef struct
{
KeyType key;
InfoType otherinfo;
}HashTable;
int H(KeyType key);//散列函数
void CreateHashTable(HashTable[]);//使用顺序存储结构建立散列表
void OutputHashTable(HashTable[]);//输出散列表
int SearchHash(HashTable[], KeyType key);//在散列表中查找关键字为key的结点
int main()
{
HashTable HT[TableSize];
for(int i=0; i<TableSize; i++)//将散列表每个结点的key分量初始化为NULLKEY
HT[i].key = NULLKEY;
KeyType key;
int res;
CreateHashTable(HT);
OutputHashTable(HT);
cout << "Input the key you want to search: " ;
cin >> key;
while (key!=ENDFLAG)//直到读入的是ENDFLAG(0),循环退出
{
res = SearchHash(HT, key);
if (res==-1)
cout << "Not find the key " << key << endl;
else
cout << "Find the key " << key << ", position = " << res << endl;
cout << "Input the key you want to search: " ;//继续读入下一个要查找的key
cin >> key;
}
return 0;
}
int H(KeyType key)//散列函数
{
return key%mod ;
}
void CreateHashTable(HashTable HT[])
{//使用顺序存储结构建立散列表
int pos;
KeyType key;
cout << "Input your keys: " ;
cin >> key;
while (key!=ENDFLAG)//直到读入的是ENDFLAG(0),循环退出
{
pos = H(key) ;//根据散列函数计算散列地址
for(int i=0; i<TableSize; i++)
{
if ( HT[pos].key==NULLKEY ) //当前散列地址的key值为空
{
HT[pos].key = key; //将key值写入当前散列地址
break;
}
pos = (pos+1)%TableSize ; //当前散列地址非空,使用线性探测法计算下一个散列地址
}
cin >> key;//继续读入下一个要写入的key
}
}
void OutputHashTable(HashTable HT[])
{
for(int i=0; i<TableSize; i++)
cout << "关键字:" << HT[i].key << ", 地址:" << i << endl;
}
int SearchHash(HashTable HT[], KeyType key)
{//在散列表中查找关键字为key的结点
int pos = H(key) ;//根据散列函数计算散列地址
for(int i=0; i<TableSize; i++)
{
if(HT[pos].key==key)//当前散列地址的key值就是要查找的key值
return pos ;
if(HT[pos].key==NULLKEY)//当前散列地址的key值为空
return -1;
pos = (pos + 1) % TableSize;//当前散列地址非空且不是要查找的key值,使用线性探测法计算下一个查找地址
}
}
//使用线性探测法解决冲突
#include<iostream>
using namespace std;
const int NULLKEY = 0;
const int ENDFLAG = 0;
const int TableSize = 16;
const int mod = 13;
typedef int KeyType;
typedef char InfoType;
typedef struct
{
KeyType key;
InfoType otherinfo;
}HashTable;
int H(KeyType key);//散列函数
void CreateHashTable(HashTable[]);//使用顺序存储结构建立散列表
void OutputHashTable(HashTable[]);//输出散列表
int SearchHash(HashTable[], KeyType key);//在散列表中查找关键字为key的结点
int main()
{
HashTable HT[TableSize];
for(int i=0; i<TableSize; i++)//将散列表每个结点的key分量初始化为NULLKEY
HT[i].key = NULLKEY;
KeyType key;
int res;
CreateHashTable(HT);
OutputHashTable(HT);
cout << "Input the key you want to search: " ;
cin >> key;
while (key!=ENDFLAG)//直到读入的是ENDFLAG(0),循环退出
{
res = SearchHash(HT, key);
if (res==-1)
cout << "Not find the key " << key << endl;
else
cout << "Find the key " << key << ", position = " << res << endl;
cout << "Input the key you want to search: " ;//继续读入下一个要查找的key
cin >> key;
}
return 0;
}
int H(KeyType key)//散列函数
{
return key%mod ;
}
void CreateHashTable(HashTable HT[])
{//使用顺序存储结构建立散列表
int pos;
KeyType key;
cout << "Input your keys: " ;
cin >> key;
while (key!=ENDFLAG)//直到读入的是ENDFLAG(0),循环退出
{
pos = H(key) ;//根据散列函数计算散列地址
for(int i=0; i<TableSize; i++)
{
if ( HT[pos].key==NULLKEY ) //当前散列地址的key值为空
{
HT[pos].key = key; //将key值写入当前散列地址
break;
}
pos = (pos+1)%TableSize ; //当前散列地址非空,使用线性探测法计算下一个散列地址
}
cin >> key;//继续读入下一个要写入的key
}
}
void OutputHashTable(HashTable HT[])
{
for(int i=0; i<TableSize; i++)
cout << "关键字:" << HT[i].key << ", 地址:" << i << endl;
}
int SearchHash(HashTable HT[], KeyType key)
{//在散列表中查找关键字为key的结点
int pos = H(key) ;//根据散列函数计算散列地址
for(int i=0; i<TableSize; i++)
{
if(HT[pos].key==key)//当前散列地址的key值就是要查找的key值
return pos ;
if(HT[pos].key==NULLKEY)//当前散列地址的key值为空
return -1;
pos = (pos + 1) % TableSize;//当前散列地址非空且不是要查找的key值,使用线性探测法计算下一个查找地址
}
}
阅读全文
0 0
- 建立Hash表(散列表)(运用线性探测法解决冲突)
- 平方探测和线性探测解决散列表冲突的区别(优点及缺点)
- java 解决Hash(散列)冲突的四种方法--开放定址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区
- 散列表(平方探测法解决冲突)
- hash线性探测开放定址法解决冲突
- Hash解决冲突之线性探测
- java数据结构——Hash的实现(数组) 线性探测的方法解决冲突
- Hash 散列表(分离链接法解决冲突)
- 哈希表(线性探测法处理冲突)
- hash冲突之线性探测
- hash表线性探测法
- SDUT 3379 数据结构实验之查找七:线性之哈希表(线性探测法解决冲突)
- HashTable哈希表/散列表(线性探测和二次探测)
- 散列表(三):冲突处理的方法之开地址法(线性探测再散列的实现)
- 散列表(三):冲突处理的方法之开地址法(线性探测再散列的实现)
- hash,分离链接法,探测散列表(二次探测),再散列的代码
- 散列表--线性探测法
- 线性探测法hash
- python 偏函数(functoosl, partial)
- A股进阶——投资者必看的熊市生存法则
- jsp
- 学习淘淘商城第八十八课(单点登录用户登录--Controller层及测试)
- 频率论(Frequentist)方法和贝叶斯方法
- 建立Hash表(散列表)(运用线性探测法解决冲突)
- spring注入方式-构造函数优缺点
- liunx mysql 用户、权限、编码
- 并发总结
- 【python 百度指数抓取】python 模拟登陆百度指数,图像识别百度指数
- PAT (Advanced Level) Practise 1116 Come on! Let's C (20)
- DrawerLayout和NavigationView使用详解
- x86 最简单溢出实践
- 将其他库中的表的数据批量插入添加到另一个库的表中