哈希表也称作散列表,是介于链表和二叉树之间的一种结构体。因为这二者之间各有优缺点,链表的插入和删除操作可以在O(1)内实现,很方便,但是查询操作很麻烦,二叉树的数据排序严格有序,但是需要建立在大量的指针的基础之上,所以,而为了综合他们的长处,一种新的数据结构就诞生出来了–哈希表。
就如同一个网站管理系统,整个互联网有许许多多的网页,有的网页是关于新闻方面的,有的网页是视频网站,有的网页是提供图片的,如果需要快速的查询一个《微微一笑很倾城》这个电视剧,那么不可能将互联网中的所有网站都遍历过一遍,那样效率太慢了。所以,会将《微微一笑很倾城》电视剧放到以视频为归类的网站上,将奥巴马访华的新闻事件存放到新闻专页,将梵高画像放到图片网站上。然后查询《微微一笑很倾城》的时候就可以直接定位到视频网站,再从视频网站上查找具体电视节目。哈希表的大体思路就如上所述。
下面就是哈希表的简单操作代码:
哈希表的结构:
#define Elemtype int
#define TABLESIZE 10
typedef struct _Node
{
Elemtype data;
struct _Node* next;
}Node;
typedef struct _HashTable
{
Node* array[TABLESIZE];
}HashTable;

创建哈希表:
HashTable* CreateHashTable()
{
HashTable* p;
p = (HashTable*)malloc(sizeof(HashTable));
memset(p, 0, sizeof(HashTable));
return p;
}

查找哈希表:
Node* SearchHashTable(HashTable *H, Elemtype data)
{
Node* pn;
if(NULL == H)//表未创建,返回空
{
return NULL;
}
if(NULL == (pn = H->array[data%TABLESIZE]))//对应位置没有元素,返回空
{
return NULL;
}
while(pn)//遍历键值下的链表
{
if(data == pn->data);//若找到,返回节点
{
return pn;
}
pn = pn->next;
}
return NULL;//键值下没有匹配节点,返回空
}

插入节点:
bool InsertHashNode(HashTable* H, Elemtype data)
{
Node *pn;
if(NULL == H)
{
return NULL;
}
if(NULL == H->array[data%TABLESIZE])//键值下链表为空,则创建
{
pn = (Node*)malloc(sizeof(Node));
memset(pn, 0, sizeof(Node));
pn->data = data;
H->array[data%TABLESIZE] = pn;
return TRUE;
}
if(NULL != SearchHashTable(H, data))//若已经存在,则返回
return NULL;
pn = H->array[data%TABLESIZE];//定位到键值链
while(pn->next)
{
pn = pn->next;
}
pn->next = (Node *)malloc(sizeof(Node));
memset(pn->next, 0, sizeof(Node));
pn->next->data = data;
return TRUE;
}

删除节点:
bool DeleteHashNode(HashTable *H, Elemtype data)
{
if(NULL == H)
{
return NULL;
}
Node *pn;
if(NULL == (pn = HashTable[data%TABLESIZE]))
{
return NULL;
}
Node *prev = pn;//用来记录当前节点的前一个节点
while(pn)
{
if(data == pn->data)
{
prev = pn->next;//前一个节点指向当前节点的下一个节点
free(pn);//将当前节点删除
return TRUE;
}
prev = pn;
pn = pn->next;
}
return NULL;//没有找到对应的节点
}

以上内容仅作参考,如有错误,欢迎指正。

数据结构算法之哈希表相关推荐

  1. 【从蛋壳到满天飞】JS 数据结构解析和算法实现-哈希表

    前言 [从蛋壳到满天飞]JS 数据结构解析和算法实现,全部文章大概的内容如下: Arrays(数组).Stacks(栈).Queues(队列).LinkedList(链表).Recursion(递归思 ...

  2. 散列算法和哈希表结构

    散列算法和哈希表结构 散列算法和哈希表结构 算法概述 Hash ,一般翻译做" 散列" ,也有直接音译为" 哈希" 的,就是把任意长度的输入(又叫做预映射, p ...

  3. 哈希算法、哈希表的作用与原理

    闲谈Hash 由于以前对hash的理解就不是很透彻,与是在工作不忙的时候,回首掏了一波hash,并记录一下自己的心得体会. 哈希算法和哈希表都不是自然产生的,都是人为的产物,既然是人为了的,那么就可以 ...

  4. 【算法】哈希表 ( 两数之和 )

    算法 系列博客 [算法]刷题范围建议 和 代码规范 [算法]复杂度理论 ( 时间复杂度 ) [字符串]最长回文子串 ( 蛮力算法 ) [字符串]最长回文子串 ( 中心线枚举算法 ) [字符串]最长回文 ...

  5. 数据结构实验:哈希表

    数据结构实验:哈希表 题目描述 在n个数中,找出出现次数最多那个数字,并且输出出现的次数.如果有多个结果,输出数字最小的那一个. 输入 单组数据,第一行数字n(1<=n<=100000). ...

  6. 查找算法【哈希表】 - 处理冲突的方法:开放地址法-线性探测法

    查找算法[哈希表] - 处理冲突的方法 无论如何设计散列函数,都无法避免发生冲突. 如果发生冲突,就需要处理冲突. 处理冲突的方法分为3种: 开放地址法 链地址法 建立公共溢出区. [开放地址法] 开 ...

  7. 查找算法【哈希表】 - 散列查找及性能分析

    查找算法[哈希表] - 散列查找及性能分析 散列表虽然建立了关键字和存储位置之间的直接映像,但冲突不可避免,在散列表的查找过程中,有的关键字可以通过直接定址1次比较找到,有的关键字可能仍然需要和若干关 ...

  8. 查找算法【哈希表】- 散列函数

    查找算法[哈希表]- 散列函数 散列函数(Hash Function),又被称为哈希函数,是将关键字映射到存储地址的函数,被记为hash(key)=Addr. 设计散列函数时需要遵循两个原则: ①散列 ...

  9. 【夜深人静写数据结构与算法 | 第八篇】哈希算法与哈希表

    目录 前言: 哈希: 哈希表: 哈希表组成: 哈希表实例: 哈希函数: TIPS: 总结 前言: 如果此时我要你默写一个有一百位的数字,你要如何做才能保证不会漏写呢?我们有一种方法很好用:直接数我们写 ...

最新文章

  1. windows模糊查询指定进程是否存在
  2. 转载:c输入空格字符串
  3. 2017年第八届蓝桥杯 —— 训练题目 —— 空瓶换汽水
  4. 中文格式_常见中文编码格式
  5. 【做题记录】人类智慧
  6. 小学数学加减法测试软件,儿童数学加法运算火箭(测试版)
  7. mysql锁场景_MySQL死锁系列-常见加锁场景分析
  8. 程序员必知--代码规范
  9. python画离散点_python画散点图
  10. mysql数据库基操,都坐下!
  11. ⒔Bash 内部命令
  12. Tomcat配置域名访问
  13. 读《因果的真相》第四章摘抄笔记
  14. 错误1311。没有找到源文件:D:\MSOCache\All Users\{90150000-0015-0804-1000-0000000FF1CE}-D\AccLR.CAB。请确认存在该文件,并且您
  15. mysql 14 关闭休眠链接
  16. 如何将一个vector内容赋值给另一个vector C/C++
  17. YUI可真是个不错的东东
  18. 误删u盘文档能恢复吗?u盘删除的文件在哪里找回
  19. xcode 翻新工程_18个著名网站的酷概念设计(翻新)
  20. 使用 Go 语言进行并发编程的实践方法

热门文章

  1. 随机信号处理的一些归纳
  2. hibernate中各种不一样的查询hql,hqc(一)
  3. 脚崴了!又肿又疼怎么办?
  4. 将家安在天涯,将这儿作为副战
  5. 2021中国大学生程序设计竞赛(CCPC)- 网络选拔赛(重赛)Subpermutation
  6. LayUi 之 模板引擎
  7. 盘古开源在芯片领域崛起,专注于芯片研发
  8. 3D测量| 主动模式投影提高AOI三维测量精度
  9. 计算机开模拟器,iOS在同一台电脑上打开多个模拟器
  10. 神经网络入门(连载之一)