【 声明:版权全部,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

hash表,有时候也被称为散列表。个人觉得,hash表是介于链表和二叉树之间的一种中间结构。链表使用十分方便,可是数据查找十分麻烦;二叉树中的数据严格有序,可是这是以多一个指针作为代价的结果。hash表既满足了数据的查找方便,同一时候不占用太多的内容空间,使用也十分方便。

打个比方来说,全部的数据就好像许很多多的书本。假设这些书本是一本一本堆起来的,就好像链表或者线性表一样,整个数据会显得非常的无序和凌乱,在你找到自己须要的书之前,你要经历很多的查询过程;而假设你对全部的书本进行编号,而且把这些书本按次序进行排列的话,那么假设你要寻找的书本编号是n,那么经过二分查找,你非常快就会找到自己须要的书本;可是假设你每个种类的书本都不是非常多,那么你就能够对这些书本进行归类,哪些是文学类,哪些是艺术类,哪些是工科的,哪些是理科的,你仅仅要对这些书本进行简单的归类,那么寻找一本书也会变得非常easy,比方说假设你要找的书是计算机方面的书,那么你就会到工科一类其中去寻找,这样查找起来也会显得麻烦。

不知道这样举例你清楚了没有,上面提到的归类方法事实上就是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表能够和二叉树形成复合结构,至于为什么,建议朋友们好好思考一下?

一步一步写算法(之hash表)相关推荐

  1. 一步一步写算法(之图结构)

    原文:一步一步写算法(之图结构) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 图是数据结构里面的重要一章.通过图,我们可以判断两个点之间是 ...

  2. 一步一步写算法(之prim算法 中)

    原文:一步一步写算法(之prim算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] C)编写最小生成树,涉及创建.挑选和添加过程 MI ...

  3. 一步一步写算法(之寻找丢失的数)

    一步一步写算法(之寻找丢失的数) 原文:一步一步写算法(之寻找丢失的数) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 假设我们有一个1亿个 ...

  4. 一步一步写算法(之克鲁斯卡尔算法 中)

    一步一步写算法(之克鲁斯卡尔算法 中) 原文:一步一步写算法(之克鲁斯卡尔算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面说到 ...

  5. 一步一步写算法(之prim算法 下)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前两篇博客我们讨论了prim最小生成树的算法,熟悉了基本的流程.基本上来说,我们是按照自上而下 ...

  6. 一步一步写算法(开篇)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 算法是计算机的生命.没有算法,就没有软件,计算机也就成了一个冰冷的机器,没有什么实用价值.很多 ...

  7. 编程题C语言写牛牛数星星,一步一步写算法(之“数星星”)

    原文: 一步一步写算法(之"数星星") [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 学过编程的朋友都知道,当初为了学习 ...

  8. 一步一步写算法(之排序二叉树删除-1)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 相比较节点的添加,平衡二叉树的删除要复杂一些.因为在删除的过程中,你要考虑到不同的情况,针对每 ...

  9. 一步一步写算法(之哈希二叉树)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 用过平衡二叉树的朋友都清楚,平衡二叉树的最大优点就是排序.不管是在数据插入的时候还是在数据删除 ...

最新文章

  1. bootstrap 两个轮播图冲突_Bootstrap的轮播图样式
  2. Socket网络通讯_TCP协议
  3. 摆脱困境:将运行时配置作为JSON返回
  4. Linux静态库和动态库学习总结
  5. 把一个结构体当做属性后碰到的问题
  6. 可到了关键部分的作文
  7. 新型冠状病毒数据抓取及整理详细流程
  8. 指针变量使用规则实例
  9. java多线程,java线程同步
  10. java操作字节码_操作Java字节码
  11. 给龙芯的OpenJDK8升级
  12. mysql中url的格式_MySQL JDBC URL中的格式以及参数介绍
  13. CarMaker入门第二课-创建第一个TestRun
  14. linux文件复制粘贴权限,Linux 文件特殊权限
  15. 一键清除失效/删除微博转发微博收藏爬虫
  16. 正点原子阿波罗STM32F7-红外遥控原理及代码
  17. “和合信诺”获启赋资本数千万元Pre-A轮融资-专注监管科技、助力金融业落地监管合规最后一公里
  18. 《OpenDRIVE1.6规格文档》2
  19. 发自内心的恐惧一个人,怎么做才能坦然面对他?
  20. java使用循环输出等腰三角

热门文章

  1. 腾讯发布人工智能辅助翻译,致敬人工翻译
  2. 前沿地带:从量子计算到量子互联网
  3. 行业|深度解析:医疗机器人商用要过几道坎
  4. 谷歌如何利用人工智能重塑美国医疗行业?
  5. 假如鲁迅是程序员......
  6. 前 Google 工程师总结的算法面试指南
  7. 四年磨一剑,机械出身的我是如何拿到蚂蚁金服 Offer 的!
  8. CSDN 湘苗培优,打造高素质技术人才
  9. 腾讯发布AR导航,“生态+技术”驱动下一代智能座舱体验跃迁
  10. ISP PIPLINE (九_1) Denoise 之 space domain denoise