哈希表的应用实例 C语言实现
转载:https://blog.csdn.net/zouchunlaigo1988/article/details/7163920 但原文代码有瑕疵,略作修改。但是仍有不足之处,
如姓名fuzongkai和姓名luzhijian及姓名xujinfeng的关键字均为974.
#include<stdio.h>
#define NAME_NO 30
#define HASH_LENGTH 50
#define M 50;
typedef struct
{
char *py; //名字的拼音
int k; //名字拼音所对应的ASCII码的和
}NAME;
typedef struct //哈希表
{
char *py; //名字的拼音
int k; //拼音所对应的ASCII码的和
int si; //查找长度
}HASH;
NAME NameList[NAME_NO];
HASH HashList[HASH_LENGTH];
void InitNameList()
{
char *f;
int r, s0, i;
NameList[0].py = "chenliang";//陈亮
NameList[1].py = "chenyuanhao";//陈元浩
NameList[2].py = "chengwenliang";//程文亮
NameList[3].py = "dinglei";//丁磊
NameList[4].py = "fenghanzao";//冯汉枣
NameList[5].py = "fuzongkai";//付宗楷
NameList[6].py = "hujingbin";//胡劲斌
NameList[7].py = "huangjianwu";//黄建武
NameList[8].py = "lailaifa";//赖来发
NameList[9].py = "lijiahao";//李嘉豪
NameList[10].py = "liangxiaocong";//梁晓聪
NameList[11].py = "linchunhua";//林春华
NameList[12].py = "liujianhui";//刘建辉
NameList[13].py = "luzhijian";//卢志健
NameList[14].py = "luonan";//罗楠
NameList[15].py = "quegaoxiang";//阙高翔
NameList[16].py = "sugan";//苏淦
NameList[17].py = "suzhiqiang";//苏志强
NameList[18].py = "taojiayang";//陶嘉阳
NameList[19].py = "wujiawen";//吴嘉文
NameList[20].py = "xiaozhuomin";//肖卓明
NameList[21].py = "xujinfeng"; //许金峰
NameList[22].py = "yanghaichun";//杨海春
NameList[23].py = "yeweixiong";//叶维雄
NameList[24].py = "zengwei";//曾玮
NameList[25].py = "zhengyongbin";//郑雍斌
NameList[26].py = "zhongminghua";//钟明华
NameList[27].py = "chenliyan";//陈利燕
NameList[28].py = "liuxiaohui";//刘晓慧
NameList[29].py = "panjinmei";//潘金梅
for (i = 0; i < NAME_NO; i++)
{
s0 = 0;
f = NameList[i].py;
for (r = 0; *(f + r) != '\0'; r++)/*将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字*/
s0 = *(f + r) + s0;
NameList[i].k = s0;
}
}
void CreateHashList()
{
int i;
for (i = 0; i < HASH_LENGTH; i++)
{
HashList[i].py = "";
HashList[i].k = 0;
HashList[i].si = 0;
}
for (i = 0; i < NAME_NO; i++)
{
int sum = 0;
int adr = (NameList[i].k) % M;//哈希函数
int d = adr;
if (HashList[adr].si == 0)//如果不冲突
{
HashList[adr].k = NameList[i].k;
HashList[adr].py = NameList[i].py;
HashList[adr].si = 1;
}
else//冲突
{
do
{
d = (d + NameList[i].k % 10 + 1) % M;//伪随机探测再散列法处理冲突
sum = sum + 1; //查找次数加1
} while (HashList[d].k != 0);
HashList[d].k = NameList[i].k;
HashList[d].py = NameList[i].py;
HashList[d].si = sum + 1;
}
}
}
void FindList() //查找
{
char name[20] = { 0 };
int s0 = 0, r, sum = 1, adr, d;
printf("请输入姓名的拼音:");
scanf("%s", name);
for (r = 0; r < 20; r++) //求出姓名的拼音所对应的整数(关键字)
s0 += name[r];
adr = s0 % M; //使用哈希函数
d = adr;
if (HashList[adr].k == s0) //分3种情况进行判断
printf("\n姓名:%s 关键字:%d 查找长度为: 1", HashList[d].py, s0);
else if (HashList[adr].k == 0)
printf("无此记录!");
else
{
int g = 0;
do
{
d = (d + s0 % 10 + 1) % M; //伪随机探测再散列法处理冲突
sum = sum + 1;
if (HashList[d].k == 0)
{
printf("无此记录! ");
g = 1;
}
if (HashList[d].k == s0)
{
printf("\n姓名:%s 关键字:%d 查找长度为:%d", HashList[d].py, s0, sum);
g = 1;
}
} while (g == 0);
}
}
void Display()
{
int i;
float average = 0;
printf("\n地址\t关键字\t\t搜索长度\tH(key)\t 姓名\n"); //显示的格式
for (i = 0; i < 50; i++)
{
printf("%d ", i);
printf("\t%d ", HashList[i].k);
printf("\t\t%d ", HashList[i].si);
printf("\t\t%d ", HashList[i].k % 30);
printf("\t %s ", HashList[i].py);
printf("\n");
}
for (i = 0; i < HASH_LENGTH; i++)
average += HashList[i].si;
average /= NAME_NO;
}
int main()
{
char ch1;
InitNameList();
CreateHashList();
do
{
printf("\nD. 显示哈希表\nF. 查找\nQ. 退出\n请选择: ");
scanf("%c", &ch1);
switch (ch1)
{
case 'D':Display(); printf("\n"); break;
case 'F':FindList(); printf("\n"); break;
case 'Q':exit(0);
}
printf( "come on !(y/n):");
scanf("%c", &ch1);
} while (ch1 != 'n');
system("pause");
return 0;
}
哈希表的应用实例 C语言实现相关推荐
- 06 数据结构与算法之哈希表(拉链法) (C语言实现)
注:只给出C语言实现代码,涉及到的数据结构相关概念请自行阅读相关书籍或参考其他博文: 将哈希表理解为一个顺序表,顺序表里面存储的是一个链表(拉链法解决碰撞) 注:(hash & 0x7FFFF ...
- C语言实现简单的哈希表
CRC是通信领域中用于校验数据传输正确性的最常用机制,也是Hash算法的一个典型应用,Hash一般翻译为"散列",也可直接音译为"哈希",就是把任意长度的输入( ...
- c语言哈希表电子辞典_关于redis涉及的知识点,C语言如何操作redis
redis是什么? redis是一个由 Salvatore Sanfilippo 写的 key-value 存储系 统.Redis 是一个开源的使用 ANSI C 语言编写.遵守 BSD 协议.支持网 ...
- c++ 哈希表_C语言精华知识:表驱动法编程实践
问:怎么每天看到这种文章? 答:只需搜索公众号"51单片机学习网"免费关注 排版:嵌入式云IOT技术圈 数据压倒一切.如果选择了正确的数据结构并把一切组织的井井有条,正确的算法就不 ...
- C语言哈希表的简单实现——数组+链表(拉链法)
C语言哈希表的简单实现--数组+链表(拉链法) 1.哈希表简介 哈希表详细介绍可以参考这篇文章 2.哈希表拉链法实现 2.1完全由本人思路实现,如有错误,欢迎批评指正 哈希声明文件hash.h /* ...
- 数据结构源码笔记(C语言):哈希表的相关运算算法
//实现哈希表的相关运算算法 #include<stdio.h> #include<malloc.h> #include<string.h>#define MaxS ...
- C语言实现哈希表(附完整源码)
C语言实现哈希表 C语言实现哈希表附完整源码 C语言实现哈希表附完整源码 #include<stdio.h> #include<stdlib.h> #define SUCCES ...
- 哈希表(散列表)基础概念与经典题目(Leetcode题解-Python语言)之中——实际应用
上一节介绍了哈希表的原理与设计方法,这一节则直接python中现有的哈希表类型:哈希集合 set(集合)和哈希映射 dict(字典)来解决实际应用(刷题). 零.概念 在介绍实际应用之前,有一个概念我 ...
- 哈希表,哈希算法(C语言)
哈希表 哈希表,又称散列表,常用于在海量数据中查找数据 哈希表中元素是由哈希函数确定的.将数据元素的关键字key作为自变量,通过一定的函数关系H(称为哈希函数),计算出的值,即为该元素的存储地址.其优 ...
最新文章
- 【进阶版九宫格背景图片】如何仅仅依靠background的几个属性组合搭配出酷炫的背景图片效果,并自适应任何宽高效果?
- activemq 各种版本区别_Apache ActiveMQ 各个版本所依赖的JDK版本
- Zxing 竖屏切换 android
- php 欺骗提交,欺骗PHP整数
- 用初次训练的SVM+HOG分类器在负样本原图上检测HardExample
- python基础语法教程:行与缩进
- Linux服务器上配置Tomcat的docBase路径映射时遇到的坑
- 批处理命令 / cd
- 前端学习(1908)vue之电商管理系统电商系统之渲染修改用户的表单预先验证
- buffer 和cache的区别
- android系统(8)---android事件分发机制
- Java基础学习总结(60)——Java常用的八种排序算法
- 问题处理:VMware Workstation和Device / Credential Guard不兼容
- 实用的论文工具大盘点【建议收藏】
- web性能压力测试工具
- 软件测试基础学习笔记
- 服务器SQL上的MSDTC不可用解决办法
- 智慧城市同城V4 v1.7.1
- 【计算机网络】湖科大微课堂笔记 p7-10 计算机网络体系结构:常见的计算机网络体系结构、必要性、分层思想、专业术语
- 嵌入式开发和应用技术大全