【数据结构】人名查询哈希表设计(链地址法)

news/2025/2/12 11:06:14/

文章目录

  • 核心代码
    • 链表节点定义
    • 链地址法处理冲突
    • 查询函数
  • 完整代码下载

核心代码

哈希表使用「链地址法」解决地址冲突的方式,其数据结构就采用 数组+链表 ,数组的每一个元素都是一个链表节点,当地址冲突时,就往当前地址的链表末尾追加,这里可以把上一篇文章「 线性探测法 」稍作修改即可:

链表节点定义

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


http://www.ppmy.cn/news/224847.html

相关文章

python识别中文人名_中文人名识别

中文姓名的构成规律 中文姓名一般由二字或三字组成,第一字为姓氏字(复姓为前两字),其后的一到两个汉字为名用字。统计表明,中文姓名在用字上也有一定规律:一方面某些字频频出现在姓名中,如在姓氏用字中,虽然姓氏辞典中列举了几千个姓氏字,但目前实际使用的不过几百个…

使用SQL查询所有数据库名、表名和表字段名

目录 使用SQL查询所有数据库名、表名和表字段名 MySQL中查询所有数据库名和表名 SQLServer中查询所有数据库名和表名 Oracle中查询所有数据库名和表名 使用SQL查询所有数据库名、表名和表字段名 MySQL中查询所有数据库名和表名 1.查询所有数据库 show databases;2.查询指…

据公安部姓名查询系统,全国最爆笑的人名~~

刘产 赖月京&#xff08;还是个男的&#xff09; 范剑 姬从良 范统 夏建仁 朱逸群 秦寿生&#xff08;亏他父母想得出&#xff09; 庞光 杜琦燕 魏生津 矫厚根 沈京兵 杜子腾 排名第一的&#xff1a;史珍香 群发一下&#xff0c;大家减减压…

mysql查询重名_同名同姓搜索,同名身份证号码数据库

同名同姓搜索&#xff0c;同名身份证号码数据库 时间&#xff1a;2020-04-27 14:30:02 不少爸爸妈妈在给婴儿取姓名的时候&#xff0c;会有兴趣知道在全国有多少人重名&#xff0c;希望宝宝的姓名不会跟太多人重复。或者有的小伙伴纯粹想知道全中国跟自己重名的有多少人&#x…

根据输入的电话号码查询联系人

根据输入的电话号码查询联系人 在salesforce 平台下&#xff0c;根据输入的电话号码查询联系人有很多。这里用到简单的 Apex 和 visualforce来实现。下面给出对应的.cls 文件和 .page 文件&#xff1a; 1. SearchContactsByPhone.cls public with sharing class SearchCont…

sql查询数据库表名

查询数据库里所有表名和字段名的语句 SQL 查询所有表名&#xff1a; SELECT NAME FROM SYSOBJECTS WHERE TYPEU SELECT * FROM INFORMATION_SCHEMA.TABLES查询表的所有字段名&#xff1a; SELECT NAME FROM SYSCOLUMNS WHERE IDOBJECT_ID( 表名 ) SELECT * FROM INFORMATION_SC…

专家查查-专家人才查询网

页面介绍专家查查&#xff1a;https://zjchacha.cn/外页面接口&#xff1a;![image.png](attachment:image.png)https://api.zjchacha.cn/api/s?callbackresultcallback&q%E5%8D%8E%E4%B8%AD%E5%B8%88%E8%8C%83%E5%A4%A7%E5%AD%A6&rangeall&honor&h-1&dom…

中国人名识别

基于角色标注的中国人名识别的原理和流程&#xff1a; 编码 代码 意义 例子 B Pf 姓氏 张华平先生 C Pm 双名的首字 张华平先生 D Pt 双名的末字 张华平先生 E Ps 单名 张浩说&#xff1a;“我是一个好人” F Ppf 前缀 老刘、小李 G Plf 后缀 王总、刘老、肖氏、吴妈、叶帅 K…