转载: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语言实现相关推荐

  1. 06 数据结构与算法之哈希表(拉链法) (C语言实现)

    注:只给出C语言实现代码,涉及到的数据结构相关概念请自行阅读相关书籍或参考其他博文: 将哈希表理解为一个顺序表,顺序表里面存储的是一个链表(拉链法解决碰撞) 注:(hash & 0x7FFFF ...

  2. C语言实现简单的哈希表

    CRC是通信领域中用于校验数据传输正确性的最常用机制,也是Hash算法的一个典型应用,Hash一般翻译为"散列",也可直接音译为"哈希",就是把任意长度的输入( ...

  3. c语言哈希表电子辞典_关于redis涉及的知识点,C语言如何操作redis

    redis是什么? redis是一个由 Salvatore Sanfilippo 写的 key-value 存储系 统.Redis 是一个开源的使用 ANSI C 语言编写.遵守 BSD 协议.支持网 ...

  4. c++ 哈希表_C语言精华知识:表驱动法编程实践

    问:怎么每天看到这种文章? 答:只需搜索公众号"51单片机学习网"免费关注 排版:嵌入式云IOT技术圈 数据压倒一切.如果选择了正确的数据结构并把一切组织的井井有条,正确的算法就不 ...

  5. C语言哈希表的简单实现——数组+链表(拉链法)

    C语言哈希表的简单实现--数组+链表(拉链法) 1.哈希表简介 哈希表详细介绍可以参考这篇文章 2.哈希表拉链法实现 2.1完全由本人思路实现,如有错误,欢迎批评指正 哈希声明文件hash.h /* ...

  6. 数据结构源码笔记(C语言):哈希表的相关运算算法

    //实现哈希表的相关运算算法 #include<stdio.h> #include<malloc.h> #include<string.h>#define MaxS ...

  7. C语言实现哈希表(附完整源码)

    C语言实现哈希表 C语言实现哈希表附完整源码 C语言实现哈希表附完整源码 #include<stdio.h> #include<stdlib.h> #define SUCCES ...

  8. 哈希表(散列表)基础概念与经典题目(Leetcode题解-Python语言)之中——实际应用

    上一节介绍了哈希表的原理与设计方法,这一节则直接python中现有的哈希表类型:哈希集合 set(集合)和哈希映射 dict(字典)来解决实际应用(刷题). 零.概念 在介绍实际应用之前,有一个概念我 ...

  9. 哈希表,哈希算法(C语言)

    哈希表 哈希表,又称散列表,常用于在海量数据中查找数据 哈希表中元素是由哈希函数确定的.将数据元素的关键字key作为自变量,通过一定的函数关系H(称为哈希函数),计算出的值,即为该元素的存储地址.其优 ...

最新文章

  1. springcloud学之前需要掌握什么_学国画之前我们需要准备什么?
  2. 文件上传服务器jvm调优,JVM性能调优解决方案(12页)-原创力文档
  3. GDT、GDTR、LDT、LDTR的学习
  4. 5、HIVE DML操作、load数据、update、Delete、Merge、where语句、基于分区的查询、HAVING子句、LIMIT子句、Group By语法、Hive 的Join操作等
  5. mysql建用户无密码_mysql建用户和修改密码和忘记密码的解决办法
  6. linux设置登录次多过多锁定时间
  7. 一直在纠结怎样取出 combox 控件elect的文字
  8. linux svn log 乱码,解决p42svn中文log乱码的问题
  9. Django搜索工具——全文检索
  10. 面试:一文搞懂Java集合
  11. Linux文件的复制、删除和移动命
  12. java.lang.VerifyError: Expecting a stack map frame
  13. 获取mysql存储过程返回值_从强网杯随便注浅析mysql存储过程
  14. Python 标准库和第三方库的安装位置、Python 第三方库安装的各种问题及解决
  15. 【转】DataGridView之为每行前面添加序号
  16. Mysql replace 与 insert on duplicate效率分析
  17. java 监听udp_Java实现Udp网络编程
  18. 《21天学通C语言(第7版)》一2.4 小 结
  19. 怎么使用quicktime
  20. An invalid domain [xx] was specified for this cookie

热门文章

  1. 日系赛璐璐鼻子上色教程,干货满满!
  2. 卡罗林斯卡医学院计算机方向,卡罗林斯卡医学院:全球卫生专业受学生欢迎
  3. MySQL的基础学习(四)
  4. openstack官方安装文档的解析--环境配置篇(1)
  5. 基于python django框架的物联网平台即将开源,兼具IoT物联网平台和IBMS系统集成平台双重特性
  6. Java偏向锁与轻量级锁
  7. win7需要计算机管理员权限,关于告诉你win7系统提示“需要管理员权限”的修复办法...
  8. 【06.11.27】【世界电影史上影片电影合集】【讯雷下载】
  9. 谷歌问答上线 悲凉下的涌动
  10. win10 移动硬盘无法弹出 提示设备已被占用