除留余数法构造哈希函数并用链地址法处理哈希冲突【C++实现】
1.题目描述
哈希函数为H(key)=key%13,哈希冲突处理方法为:链地址法
2.代码实现
首先建立一个哈希链表结点类HashNode,用于存放处理冲突时的关键字,其数据成员为一个数据域存放关键字,一个指针域指向下一关键字结点
该类相当于此图片中的链表中的结点
class HashNode//哈希链表结点
{
public:int key;//关键字域HashNode *node;//下一个关键字结点
};
HashList类声明为哈希链表类,其中每个哈希地址对应的头节点,指向哈希结点
此图中的13个哈希地址,每一个均包含一个头节点,指向该链表下的第一个结点
class HashList//哈希链表
{
public:HashNode *head;//头节点指针域
};
最后定义一个哈希表类HashTable,此为主要处理类
class HashTable//哈希表
{
public://构造函数HashTable(int size){m_length = size;Array = new HashList[size];}int HashFunction(int key);//哈希函数void HashInit();//初始化哈希表void CreateHashTable();//创建哈希表void PrintHashTable();//打印哈希表
private:HashList *Array;//哈希数组int m_length;//哈希表长
};
整个代码实现如下,创建哈希函数中我写了两种插入方法,一种为直接尾部插入,没有排序,另一种在插入之前选择插入位置按升序排序进行插入,后者相对比较抽象,线性表没有做过的可能难以理解,看懂前者我相信后者多花点时间可以理解的
#include<iostream>
using namespace std;
/*
以除留余数法构建哈希函数
哈希函数为H(key)=key%13
*/
class HashNode//哈希链表结点
{
public:int key;//关键字域HashNode *node;//下一个关键字结点
};class HashList//哈希链表
{
public:HashNode *head;//头节点指针域
};class HashTable//哈希表
{
public://构造函数HashTable(int size){m_length = size;Array = new HashList[size];}int HashFunction(int key);//哈希函数void HashInit();//初始化哈希表void CreateHashTable();//创建哈希表void PrintHashTable();//打印哈希表
private:HashList *Array;//哈希数组int m_length;//哈希表长
};//哈希函数
int HashTable:: HashFunction(int key)
{return key % 13;
}//哈希表初始化
void HashTable::HashInit()
{if (0 == m_length){return;}else{for (int i = 0; i < m_length; i++){Array[i].head = nullptr;//每个哈希地址中的head域为空,表示暂无存放关键字}}
}//创建哈希表
void HashTable::CreateHashTable()
{int key;int address;//经过哈希函数变换得到的哈希地址HashNode *head = nullptr;for (int i = 0; i < m_length-1; i++){cin >> key;address = HashFunction(key);head = Array[address].head;//定义临时HashNode指针,保存哈希地址中的头结点if (!head)//经由哈希函数得到的哈希地址暂未存放任何关键字{Array[address].head = new HashNode;//分配一个新的哈希链表结点Array[address].head->key = key;//当前结点数据域赋值为此关键字Array[address].head->node = nullptr;//当前结点指针域赋值为空}else//经由哈希函数得到的哈希地址已存放关键字,则当前关键字存放到当前地址中的哈希链表中{///*// 此为处理冲突时,关键字直接插入到哈希链表尾部,无排序//*/当前位置非空的时候//while (head->node)//{ // //临时指针指向哈希链表下一个位置// head = head->node;//}下一个位置为空时结束循环,当前关键字插入到下个位置//head->node = new HashNode;//head->node->key = key;//head->node->node = nullptr;/*此为处理冲突时,关键在在哈希链表中按升序排序*///当前哈希地址对应的哈希链表中的第一个结点关键字大于当前关键字,则在该结点之前插入当前关键字if (head->key > key){HashNode *pnew = new HashNode;//开辟一段空间pnew->key = key;//赋值pnew->node = head;//当前结点指向第一个结点Array[address].head = pnew;//头指针指向当前结点}else{//比较下一个关键字while (head->node&&head->node->key < key){head = head->node;}//退出循环,如果head的下一个结点不为空,说明head->node->key>key,key插在head之前if (head->node){HashNode *pnew = new HashNode;pnew->key = key;pnew->node = head->node;head->node = pnew;}else//head的下一个结点为空,key直接插在head之后{head->node = new HashNode;head->node->key = key;head->node->node = nullptr;}}}}
}//打印哈希表
void HashTable::PrintHashTable()
{//循环遍历哈希表for (int i = 0; i < m_length; i++){//当前哈希地址为空,输出NULLif (!Array[i].head){cout << "Array[" << i << "]" << "->" << "NULL" << endl;}else{HashNode *p = Array[i].head;//定义临时指针保存哈希地址中的头节点cout << "Array[" << i << "]" << "->";while (p){cout<< p->key << "->";p = p->node;//指向下一个关键字结点}cout << "NULL" << endl;}}
}
int main()
{HashTable Hash(13);//创建哈希表对象Hash,哈希表长为13Hash.HashInit();//哈希表初始化Hash.CreateHashTable();//创建哈希表Hash.PrintHashTable();//打印哈希表return 0;
}
运行截图,此为排序后的
除留余数法构造哈希函数并用链地址法处理哈希冲突【C++实现】相关推荐
- SWUST OJ 1012: 哈希表(链地址法处理冲突)
1012: 哈希表(链地址法处理冲突) 题目描述 采用除留余数法(H(key)=key %n)建立长度为n的哈希表,处理冲突用链地址法.建立链表的时候采用尾插法. 输入 第一行为哈西表的长度m: 第二 ...
- (7)哈希表的链地址法实现
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.哈希表在像Java. ...
- 数据结构---散列表(哈希表)链地址法
散列表链地址法基本思想是将相同散列地址的元素放在同一个单链表中,即称同义词链表.例如此时我们设一个散列函数H(key)=key%n,则可以定义一个一维数组,大小为n,数组元素对应关键字模n所得的数字. ...
- 7-15 航空公司VIP客户查询 (25分)(没用stl,哈希链地址法实现)
7-15 航空公司VIP客户查询 (25分) 不少航空公司都会提供优惠的会员服务,当某顾客飞行里程累积达到一定数量后,可以使用里程积分直接兑换奖励机票或奖励升舱等服务.现给定某航空公司全体会员的飞行记 ...
- 7-45 航空公司VIP客户查询 【哈希表 链地址法】
不少航空公司都会提供优惠的会员服务,当某顾客飞行里程累积达到一定数量后,可以使用里程积分直接兑换奖励机票或奖励升舱等服务.现给定某航空公司全体会员的飞行记录,要求实现根据身份证号码快速查询会员里程积分 ...
- 使用哈希函数:H(k)=3k MOD 11,并采用链地址法处理冲突。试对关键字序列(22,41,53,46,30,13,01,67)构造哈希表,求等概率情况下查找成功的查找长度,并设计构造哈希表
使用哈希函数:H(k)=3k MOD 11 ,并采用链地址法处理冲突. 试对关键字序列(22,41,53,46,30,13,01,67)构造哈希表, 求等概率情况下查找成功的查找长度,并设计构造哈希表 ...
- Hash——哈希法概念、哈希函数构造方法、哈希冲突解决办法(重点讨论链地址法)
声明:本篇博客根据回顾老师上课知识和书籍<数据结构--用C语言描述>(耿国华)整理得出,仅作知识回顾学习用. 1.哈希法 哈希法又称散列法.杂凑法.关键字地址计算法.相对应的表称为哈希表. ...
- Hash(除留余数法+链地址法)
//哈希函数:除留余数法 //处理冲突:链地址法 #include<stdio.h> #include<stdlib.h> #include<algorithm> ...
- c语言链地址法构造哈希表,链地址处理法构造简单哈希表
链地址法:将所有关键字为同义词的记录保存在一个线性链表中(拉链法) 设某哈希函数产生的哈希地址在区间[0,12]上,则创建指针数组add[12],其中每个元素都是一个单项链表的头结点(有值). 由于仅 ...
最新文章
- Ubuntu 10.04 LTS 网站权限不够
- VMware View是如何帮助企业省钱的
- Spring Bean init-method 和 destroy-method实例
- ubuntu安装mysql_Ubuntu18.04下安装MySQL
- python os path_python os.path模块
- html属性wmode代码,html – wmode – 浏览器的渲染行为意味着什么?
- 关于数据运营的一点小思考
- 火狐浏览器表单不跳转_表单button的outline在firefox浏览器下的问题
- MyEclipse8.5中的可视化界面JTable和JComboBox应用,及常用方法
- 编程基本功:工作完成之后,还有做好、做精、做美、做顶、做宗等境界
- LabView学习笔记——简易入门AND初级实战项目(计算器)
- Linux命令面试突击
- 计算机网络是一个_______,计算机网络习题一、名词解释计算机网络,网络拓扑结构二、填空题1.计算机网络是__________与__________结...
- 第九届蓝桥杯b组java
- 运兴ETF:期权多空双向,策略多样优势大
- MSP430 MSP430F5529 LaunchPad实验板
- 套接字sockets
- img标签图像cors跨域获取资源
- gentoo问题汇总
- SAS:字符串常用函数简介