C++语言实现hash表详解

概要:
hash表,有时候也被称为散列表。个人认为,hash表是介于链表和二叉树之间的一种中间结构。链表使用十分方便,但是数据查找十分麻烦;二叉树中的数据严格有序,但是这是以多一个指针作为代价的结果。hash表既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便。
打个比方来说,所有的数据就好像许许多多的书本。如果这些书本是一本一本堆起来的,就好像链表或者线性表一样,整个数据会显得非常的无序和凌乱,在你找到自己需要的书之前,你要经历许多的查询过程;而如果你对所有的书本进行编号,并且把这些书本按次序进行排列的话,那么如果你要寻找的书本编号是n,那么经过二分查找,你很快就会找到自己需要的书本;但是如果你每一个种类的书本都不是很多,那么你就可以对这些书本进行归类,哪些是文学类,哪些是艺术类,哪些是工科的,哪些是理科的,你只要对这些书本进行简单的归类,那么寻找一本书也会变得非常简单,比如说如果你要找的书是计算机方面的书,那么你就会到工科一类当中去寻找,这样查找起来也会显得麻烦。
不知道这样举例你清楚了没有,上面提到的归类方法其实就是hash表的本质。下面我们可以写一个简单的hash操作代码。
a)定义hash表和基本数据节点
typedef struct _NODE
{
int data;
struct _NODE* next;
}NODE;
typedef struct _HASH_TABLE
{
NODE* value[10];
}HASH_TABLE;
b)创建hash表
HASH_TABLE* create_hash_table()
{
HASH_TABLE* pHashTbl = (HASH_TABLE*)malloc(sizeof(HASH_TABLE));
memset(pHashTbl, 0, sizeof(HASH_TABLE));
return pHashTbl;
}
c)在hash表当中寻找数据
NODE* find_data_in_hash(HASH_TABLE* pHashTbl, int data)
{
NODE* pNode;
if(NULL == pHashTbl)
return NULL;
if(NULL == (pNode = pHashTbl->value[data % 10]))
return NULL;
while(pNode){
if(data == pNode->data)
return pNode;
pNode = pNode->next;
}
return NULL;
}
d)在hash表当中插入数据
STATUS insert_data_into_hash(HASH_TABLE* pHashTbl, int data)
{
NODE* pNode;
if(NULL == pHashTbl)
return FALSE;
if(NULL == pHashTbl->value[data % 10]){
pNode = (NODE*)malloc(sizeof(NODE));
memset(pNode, 0, sizeof(NODE));
pNode->data = data;
pHashTbl->value[data % 10] = pNode;
return TRUE;
}
if(NULL != find_data_in_hash(pHashTbl, data))
return FALSE;
pNode = pHashTbl->value[data % 10];
while(NULL != pNode->next)
pNode = pNode->next;
pNode->next = (NODE*)malloc(sizeof(NODE));
memset(pNode->next, 0, sizeof(NODE));
pNode->next->data = data;
return TRUE;
}
e)从hash表中删除数据
STATUS delete_data_from_hash(HASH_TABLE* pHashTbl, int data)
{
NODE* pHead;
NODE* pNode;
if(NULL == pHashTbl || NULL == pHashTbl->value[data % 10])
return FALSE;
if(NULL == (pNode = find_data_in_hash(pHashTbl, data)))
return FALSE;
if(pNode == pHashTbl->value[data % 10]){
pHashTbl->value[data % 10] = pNode->next;
goto final;
}
pHead = pHashTbl->value[data % 10];
while(pNode != pHead ->next)
pHead = pHead->next;
pHead->next = pNode->next;
final:
free(pNode);
return TRUE;
}
总结:
1、hash表不复杂,我们在开发中也经常使用,建议朋友们好好掌握;
2、hash表可以和二叉树形成复合结构,至于为什么,建议朋友们好好思考一下?
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# C++语言实现hash表
# C++语言
# hash表如何实现
# C++实现hash表
# C++中hashmap的一些使用建议
# opencv3/C++ PHash算法图像检索详解
# C++获取文件哈希值(hash)和获取torrent(bt种子)磁力链接哈希值
# 基于一致性hash算法 C++语言的实现详解
# c++中std::hash以及万能hash的使用方式
# 也会
# 你要
# 朋友们
# 的书
# 链表
# 二叉树
# 这是
# 就会
# 如果你
# 太多
# 就好像
# 一本
# 我们可以
# 希望能
# 你对
# 被称为
# 要对
# 打个
# 中也
# 中去
相关文章:
深入理解Android中的xmlns:tools属性
无锡营销型网站制作公司,无锡网选车牌流程?
c# 服务器GC和工作站GC的区别和设置
为什么Go需要go mod文件_Go go mod文件作用说明
如何在IIS7中新建站点?详细步骤解析
开封网站制作公司,网络用语开封是什么意思?
建站之星后台密码遗忘如何找回?
高性能网站服务器部署指南:稳定运行与安全配置优化方案
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?
建站之星体验版:智能建站系统+响应式设计,多端适配快速建站
php json中文编码为null的解决办法
西安专业网站制作公司有哪些,陕西省建行官方网站?
建站之星如何配置系统实现高效建站?
宝塔面板创建网站无法访问?如何快速排查修复?
,交易猫的商品怎么发布到网站上去?
建站之星如何防范黑客攻击与数据泄露?
如何零基础在云服务器搭建WordPress站点?
学校免费自助建站系统:智能生成+拖拽设计+多端适配
如何用腾讯建站主机快速创建免费网站?
制作企业网站建设方案,怎样建设一个公司网站?
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
网站制作难吗安全吗,做一个网站需要多久时间?
阿里云网站制作公司,阿里云快速搭建网站好用吗?
建站之星如何实现网站加密操作?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
如何选择CMS系统实现快速建站与SEO优化?
一键网站制作软件,义乌购一件代发流程?
昆明高端网站制作公司,昆明公租房申请网上登录入口?
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?
网站插件制作软件免费下载,网页视频怎么下到本地插件?
番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
如何通过商城免费建站系统源码自定义网站主题?
h5网站制作工具有哪些,h5页面制作工具有哪些?
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?
制作网页的网站有哪些,电脑上怎么做网页?
如何用PHP工具快速搭建高效网站?
网站制作壁纸教程视频,电脑壁纸网站?
建站主机与虚拟主机有何区别?如何选择最优方案?
如何在Windows环境下新建FTP站点并设置权限?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
如何快速搭建自助建站会员专属系统?
建站VPS推荐:2025年高性能服务器配置指南
建站之星IIS配置教程:代码生成技巧与站点搭建指南
如何在万网主机上快速搭建网站?
C#如何在一个XML文件中查找并替换文本内容
制作网站怎么制作,*游戏网站怎么搭建?
*请认真填写需求信息,我们会在24小时内与您取得联系。