【数据结构】人名查询哈希表设计(链地址法)
文章目录
- 核心代码
- 链表节点定义
- 链地址法处理冲突
- 查询函数
- 完整代码下载
核心代码
哈希表使用「链地址法」解决地址冲突的方式,其数据结构就采用 数组+链表 ,数组的每一个元素都是一个链表节点,当地址冲突时,就往当前地址的链表末尾追加,这里可以把上一篇文章「 线性探测法 」稍作修改即可:
链表节点定义
typedef struct HashNode //哈希表
{char *name; //名字的拼音int key; //拼音所对应的ASCII总和,即关键字int si; //查找长度struct HashNode *next; // 指向下一节点的指针
} HashNode;
链地址法处理冲突
void CreateHash()
{ //建立哈希表for (i = 0; i < HASH_LEN; i++) //清空哈希表,未经此操作将储存空数据{HashNode *node = &hashTable[i];node->name = "\0";node->key = 0;node->si = 0;node->next = NULL;}for (i = 0; i < NAME_LEN; i++){int si = 1; // 查找长度默认为1int adr = (nameTable[i].hashCode) % P; //除留余数法H(name)=name%P,除数为P=47HashNode *p = &hashTable[adr]; //将指针指向当前节点if (p->si != 0) //如果当前节点不为空,说明冲突了,使用「链地址法」处理冲突{si++;while (p->next != NULL) //找到当前地址的最后一个节点{p = p->next;si++;}p->next = (HashNode *)malloc(sizeof(HashNode)); // 在最后一个节点的下一个追加节点p = p->next; // 再将指针指向追加的这个节点}// 将姓名表当前的节点存进p指针指向的hash表的节点中p->key = nameTable[i].hashCode;p->name = nameTable[i].name;p->si = si;p->next = NULL;}
}
查询函数
void FindName()
{char name[20] = {0};int hashCode = 0, si = 1;printf("\n请输入想要查找的姓名的拼音:");scanf("%s", name);getchar();hashCode = gethashCode(name); //求出姓名的拼音所对应的ASCII作为关键字int adr = hashCode % P; //除留余数法去地址int j = 0;// 如果hash地址为空,则直接认为不存在if (hashTable[adr].key == 0){printf("\n没有想要查找的人!\n");return;}// 如果hashCode和name都相等if (hashTable[adr].key == hashCode && 0 == strcmp(hashTable[adr].name, name)){printf("\n姓名:%s 关键字:%d 地址:%d 查找长度为: 1\n", hashTable[adr].name, hashCode, adr);}// 如果不相等,则进行从当前地址遍历链表else{int currAddr = adr;HashNode *p = &hashTable[adr];boolean hasFind = FALSE; // 标志:标记是否查到// 遍历当前地址的链表do{si++; // 查找长度+1if (p->next != NULL){p = p->next;}// 如果找到,直接break跳出循环if (p->key == hashCode && 0 == strcmp(p->name, name)){hasFind = TRUE;printf("\n姓名:%s 关键字:%d 地址:%d 查找长度为:%d\n", p->name, hashCode, adr, si);break;}} while (p->next != NULL);if (!hasFind){printf("\n没有想要查找的人!\n");return;}}
}
完整代码下载
CSDN:https://download.csdn.net/download/weixin_44155115/85881567
【数据结构】人名查询哈希表设计(链地址法)相关推荐
- SWUST OJ 1012: 哈希表(链地址法处理冲突)
1012: 哈希表(链地址法处理冲突) 题目描述 采用除留余数法(H(key)=key %n)建立长度为n的哈希表,处理冲突用链地址法.建立链表的时候采用尾插法. 输入 第一行为哈西表的长度m: 第二 ...
- (7)哈希表的链地址法实现
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.哈希表在像Java. ...
- 数据结构学习,哈希表(链地址)
各位小伙伴,新年快乐. 哈希表,本质上是数组,而链地址就是存放了链表的数组. 借用哈希函数对某个数进行适当运算求得该数的哈希值,在根据这个哈希值对哈希表进行查找插入删除操作. 假设这是一个哈希表H,容 ...
- 数据结构---散列表(哈希表)链地址法
散列表链地址法基本思想是将相同散列地址的元素放在同一个单链表中,即称同义词链表.例如此时我们设一个散列函数H(key)=key%n,则可以定义一个一维数组,大小为n,数组元素对应关键字模n所得的数字. ...
- 除留余数法构造哈希函数并用链地址法处理哈希冲突【C++实现】
1.题目描述 哈希函数为H(key)=key%13,哈希冲突处理方法为:链地址法 c语言版数据结构上的例子 2.代码实现 首先建立一个哈希链表结点类HashNode,用于存放处理冲突时的关键字,其数据 ...
- 7-45 航空公司VIP客户查询 【哈希表 链地址法】
不少航空公司都会提供优惠的会员服务,当某顾客飞行里程累积达到一定数量后,可以使用里程积分直接兑换奖励机票或奖励升舱等服务.现给定某航空公司全体会员的飞行记录,要求实现根据身份证号码快速查询会员里程积分 ...
- 7-15 航空公司VIP客户查询 (25分)(没用stl,哈希链地址法实现)
7-15 航空公司VIP客户查询 (25分) 不少航空公司都会提供优惠的会员服务,当某顾客飞行里程累积达到一定数量后,可以使用里程积分直接兑换奖励机票或奖励升舱等服务.现给定某航空公司全体会员的飞行记 ...
- 数据结构基础(18) --哈希表的设计与实现
哈希表 根据设定的哈希函数 H(key)和所选中的处理冲突的方法,将一组关键字映射到一个有限的.地址连续的地址集 (区间) 上,并以关键字在地址集中的"映像"作为相应记录在表中的存 ...
- 使用哈希函数: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)构造哈希表, 求等概率情况下查找成功的查找长度,并设计构造哈希表 ...
最新文章
- centos 网卡聚合及Cisco交换机链路聚合
- oracle和mysql存储汉字_mysql和oracle的一个汉字占几个字节
- 训练集数量对神经网络光谱的影响
- Netty开发的基本流程及关键类说明
- 关于table边框,设置了border-collapse:collapse之后,设置border-radius没效果
- 【Cocos2d-x for WP8 学习整理】(2)Cocos2d-Html5 游戏 《Fruit Attack》 WP8移植版 开源...
- matlab连续型随机变量,matlab连续型随机变量的分布.doc
- android-手势-基础知识总结
- [转载]Linux shell中的竖线(|)——管道符号
- 【语音识别】基于matlab MFCC+SVM特定人性别识别【含Matlab源码 533期】
- ds18b20 c语言程序,ds18b20.c
- 最新杭州地铁开通时间表
- Sulley环境搭建
- 网站装饰html代码,html常用装饰代码分享
- Python生成九宫格图片
- 山东理工大学ACM平台题答案关于C语言 2098 识别浮点常量问题
- 手机的Ram和Rom是什么意思
- angularjs学习总结 详细教程(转载)
- 神经网络泛化的能力因素,神经网络泛化的能力差
- ROSNOTE : 自动拍照