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

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

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

不知道这样举例你清楚了没有,上面提到的归类方法事实上就是hash表的本质。以下我们能够写一个简单的hash操作代码。

a)定义hash表和基本数据节点

  1. typedef struct _NODE
  2. {
  3. int data;
  4. struct _NODE* next;
  5. }NODE;
  6.  
  7. typedef struct _HASH_TABLE
  8. {
  9. NODE* value[10];
  10. }HASH_TABLE;

b)创建hash表

  1. HASH_TABLE* create_hash_table()
  2. {
  3. HASH_TABLE* pHashTbl = (HASH_TABLE*)malloc(sizeof(HASH_TABLE));
  4. memset(pHashTbl, 0, sizeof(HASH_TABLE));
  5. return pHashTbl;
  6. }

c)在hash表其中寻找数据

  1. NODE* find_data_in_hash(HASH_TABLE* pHashTbl, int data)
  2. {
  3. NODE* pNode;
  4. if(NULL == pHashTbl)
  5. return NULL;
  6.  
  7. if(NULL == (pNode = pHashTbl->value[data % 10]))
  8. return NULL;
  9.  
  10. while(pNode){
  11. if(data == pNode->data)
  12. return pNode;
  13. pNode = pNode->next;
  14. }
  15. return NULL;
  16. }

d)在hash表其中插入数据

  1. STATUS insert_data_into_hash(HASH_TABLE* pHashTbl, int data)
  2. {
  3. NODE* pNode;
  4. if(NULL == pHashTbl)
  5. return FALSE;
  6.  
  7. if(NULL == pHashTbl->value[data % 10]){
  8. pNode = (NODE*)malloc(sizeof(NODE));
  9. memset(pNode, 0, sizeof(NODE));
  10. pNode->data = data;
  11. pHashTbl->value[data % 10] = pNode;
  12. return TRUE;
  13. }
  14.  
  15. if(NULL != find_data_in_hash(pHashTbl, data))
  16. return FALSE;
  17.  
  18. pNode = pHashTbl->value[data % 10];
  19. while(NULL != pNode->next)
  20. pNode = pNode->next;
  21.  
  22. pNode->next = (NODE*)malloc(sizeof(NODE));
  23. memset(pNode->next, 0, sizeof(NODE));
  24. pNode->next->data = data;
  25. return TRUE;
  26. }

e)从hash表中删除数据

  1. STATUS delete_data_from_hash(HASH_TABLE* pHashTbl, int data)
  2. {
  3. NODE* pHead;
  4. NODE* pNode;
  5. if(NULL == pHashTbl || NULL == pHashTbl->value[data % 10])
  6. return FALSE;
  7.  
  8. if(NULL == (pNode = find_data_in_hash(pHashTbl, data)))
  9. return FALSE;
  10.  
  11. if(pNode == pHashTbl->value[data % 10]){
  12. pHashTbl->value[data % 10] = pNode->next;
  13. goto final;
  14. }
  15.  
  16. pHead = pHashTbl->value[data % 10];
  17. while(pNode != pHead ->next)
  18. pHead = pHead->next;
  19. pHead->next = pNode->next;
  20.  
  21. final:
  22. free(pNode);
  23. return TRUE;
  24. }

总结:

1、hash表不复杂,我们在开发中也常常使用,建议朋友们好好掌握;

2、hash表能够和二叉树形成复合结构,至于为什么,建议朋友们好好思考一下?

一步一步写算法(之hash表)的更多相关文章

  1. 十一、从头到尾彻底解析Hash 表算法

    在研究MonetDB时深入的学习了hash算法,看了作者的文章很有感触,所以转发,希望能够使更多人受益! 十一.从头到尾彻底解析Hash 表算法 作者:July.wuliming.pkuoliver  ...

  2. Hash表及hash算法的分析

    Hash表中的一些原理/概念,及根据这些原理/概念: 一.       Hash表概念 二.       Hash构造函数的方法,及适用范围 三.       Hash处理冲突方法,各自特征 四.   ...

  3. 【数据结构】非常有用的hash表

        这篇博客的目的是让尚未学会hash表的朋友们对hash表有一个直观的理解,并且能根据本文定义出属于自己的第一个hash表,但算不上研究文,没有深究概念和成功案例.         什么是has ...

  4. Acwing:137. 雪花雪花雪花(Hash表)

    有N片雪花,每片雪花由六个角组成,每个角都有长度. 第i片雪花六个角的长度从某个角开始顺时针依次记为ai,1,ai,2,…,ai,6ai,1,ai,2,…,ai,6. 因为雪花的形状是封闭的环形,所以 ...

  5. 【转载】一步一步写算法(之hash表)

    转载自:http://blog.csdn.net/feixiaoxing/article/details/6885657 [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaox ...

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

    原文:一步一步写算法(之prim算法 下) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前两篇博客我们讨论了prim最小生成树的算法,熟悉 ...

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

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

  8. 一步一步写算法(之prim算法 上)

    原文:一步一步写算法(之prim算法 上) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面我们讨论了图的创建.添加.删除和保存等问题.今 ...

  9. 一步一步写算法(之挑选最大的n个数)

    原文:一步一步写算法(之挑选最大的n个数) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 从一堆数据中挑选n个最大的数,这个问题是网上流传的 ...

随机推荐

  1. hdu4635Strongly connected

    http://acm.hdu.edu.cn/showproblem.php?pid=4635 tarjan缩点 统计缩点后每个结点的出度入度 将那个包含原来点数最少的 且出度或者入度为0的大节点看作一 ...

  2. DTD约束文件

    在讲解DTD文件之前,我要说说一份合格的XML应该符合怎么样的规则? 就我总结一下几点,大家看看就好了: 1.一份XML有且仅有一个根元素. 2.XML是严格区分大小写的,<book>元素 ...

  3. x86、i386、i486、i586、i686和x86_64

    1.386与686 i386—几乎所有的X86平台,不论是旧的pentum或者是新的pentum-IV与K7系统CPU,都可以正常工作,i指得是Intel兼容的CPU,至于386就是CPU的等级.i5 ...

  4. 嵌入式Linux系统运行流程图

    /************************************************************************ * 嵌入式Linux系统运行流程图 * 说明: * ...

  5. (转载)C++lambda表达式

    (转载)http://www.cnblogs.com/L-hq815/archive/2012/08/23/2653002.html lambda表达式 C++ 语言中的lambda表达式在很多情况下 ...

  6. gdi写的2048

    //-------------------------------------------[头文件及引用]----------------------------------------------- ...

  7. c#保存datagridview中的数据时报错 “动态SQL生成失败。找不到关键信息”

    ilovejinglei 原文 C#中保存datagridview中的数据时报错"动态SQL生成失败.找不到关键信息" 问题描述     相关代码 using System; us ...

  8. windows和linux间互传文件

    方法1:Xshell传输文件 用rz,sz命令在xshell传输文件 很好用,然后有时候想在windows和linux上传或下载某个文件,其实有个很简单的方法就是rz,sz 首先你的Ubuntu需要安 ...

  9. 无状态、REST、RESTful 和 Web Services【整理】

    在理解 OpenStack 的过程中,常常遇到 REST 这个概念,现从各处搜罗如下: 对 Web Service 的理解: Web 服务有点像对计算机友好的网页,基于让程序可以跨网络交换信息的标准和 ...

  10. 设计模式_Memento_备忘录模式

    形象例子: 同时跟几个MM聊天时,一定要记清楚刚才跟MM说了些什么话,不然MM发现了会不高兴的哦,幸亏我有个备忘录,刚才与哪个MM说了什么话我都拷贝一份放到备忘录里面保存,这样可以随时察看以前的记录啦 ...