VC++6.0掌握哈希表的基本操作和掌握几种内部排序的方法

news2024/11/25 2:47:36

问题描述
针对某个集体中人名设计一个哈希表,使得平均查找长度不超过R,并完成相应的建表和查表程序。
1.2基本要求
假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有30个,取平均查找长度的上限为2。哈希函数用除留余数法构造,用线性探测再散列法或链地址法处理冲突。

 


1.3需求分析
1)针对某个集体中的人名设计一个哈希表,使得平均查找长度不超过R,完成相应的建立和查表程序.
2)人名为汉语拼音形式(如:庄双双 zhuangshuangshuang).
3)假设待填入哈希表的人名有30个,平均查找长度为2。哈希表用除留余数法构造,用伪随机探测在散列法处理冲突。
4)在输入人名过程中能自动识别非法输入,并给与非法输入的反馈信息要求重新输入。
         
1.4详细设计
1)系统使用到的结构定义
/*-------------线性表(1)数据结构定义------------*/    
typedef   struct   NAME                    
{      
    char   *py;       //名字的拼音   
    int   k;          //拼音对应的整数       
}NAME;      
NAME   NAMELIST[NAMENUMBER];                                        
       
typedef struct  hterm                       //哈希表   
{   
    char *py;                           //名字的拼音   
    int k;                              //拼音所对应的整数   
    int si;                                 //查找长度   
}HASH;     
2)函数定义
/*-----------------------姓名(结构体数组)初始化---------------------------------*/   
void InitNameList()                  
{   
    NameList[0].py="hanbiao";   
    NameList[1].py="dingjian";   
    NameList[2].py="linlukun";   
    NameList[3].py="wangshaowei";   
    NameList[4].py="taojun";   
    NameList[5].py="lijie";   
    NameList[6].py="shiyanqiang";   
    NameList[7].py="liuning";   
    NameList[8].py="modapeng";   
    NameList[9].py="guoqiang";   
    NameList[10].py="dudachhao";   
    NameList[11].py="zhangyingjie";   
    NameList[12].py="zhuhongbing";   
    NameList[13].py="ruanjiangyang";   
    NameList[14].py="dingyankun";   
    NameList[15].py="xiedajia";   
    NameList[16].py="zhengguolin";   
    NameList[17].py="chenwei";   
    NameList[18].py="yewei";   
    NameList[19].py="sundedong";   
    NameList[20].py="wanbinbin";   
    NameList[21].py="zhangliang";   
    NameList[22].py="gaopen";   
    NameList[23].py="xiaofan";   
    NameList[24].py="weijinchao";   
    NameList[25].py="weichunshui";   
    NameList[26].py="wangfei";   
    NameList[27].py="caojian";   
    NameList[28].py="zhushouyuan";   
    NameList[29].py="liwei";   
       
    char *f;   
    int r,s0;   
       
    for (int 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()       
{   
    for (int i=0; i<HASH_LEN;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()        
{       
    printf("\n\n请输入姓名的拼音:   ");         //输入姓名   
    char name[20]={0};     
    scanf("%s",name);      
       
    int s0=0;   
    for (int r=0;r<20;r++)                       //求出姓名的拼音所对应的整数(关键字)   
        s0+=name[r];       
       
    int sum=1;   
    int adr=s0 % M;                             //使用哈希函数   
    int 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);              
    }          
}   
1.5测试分析
白盒:
查看代码完整性
 黑盒:
测试是否可以正确的查找。
附 C语言实现源码 

 

#include "stdafx.h" 
#include <stdio.h>   
#include<conio.h>   
#include<string.h>      
   
#define HASH_LEN 50                         //哈希表的长度            
#define M 47                               
#define NAME_NO 30                      //人名的个数           
   
typedef struct NAME          
{   
    char *py;                               //名字的拼音   
    int k;                                  //拼音所对应的整数   
}NAME;   
NAME NameList[HASH_LEN];                    
   
   
typedef struct  hterm                       //哈希表   
{   
    char *py;                           //名字的拼音   
    int k;                              //拼音所对应的整数   
    int si;                                 //查找长度   
}HASH;   
HASH HashList[HASH_LEN];                               
   
/*-----------------------姓名(结构体数组)初始化---------------------------------*/   
void InitNameList()                  
{   
    NameList[0].py="hanbiao";   
    NameList[1].py="dingjian";   
    NameList[2].py="linlukun";   
    NameList[3].py="wangshaowei";   
    NameList[4].py="taojun";   
    NameList[5].py="lijie";   
    NameList[6].py="shiyanqiang";   
    NameList[7].py="liuning";   
    NameList[8].py="modapeng";   
    NameList[9].py="guoqiang";   
    NameList[10].py="dudachhao";   
    NameList[11].py="zhangyingjie";   
    NameList[12].py="zhuhongbing";   
    NameList[13].py="ruanjiangyang";   
    NameList[14].py="dingyankun";   
    NameList[15].py="xiedajia";   
    NameList[16].py="zhengguolin";   
    NameList[17].py="chenwei";   
    NameList[18].py="yewei";   
    NameList[19].py="sundedong";   
    NameList[20].py="wanbinbin";   
    NameList[21].py="zhangliang";   
    NameList[22].py="gaopen";   
    NameList[23].py="xiaofan";   
    NameList[24].py="weijinchao";   
    NameList[25].py="weichunshui";   
    NameList[26].py="wangfei";   
    NameList[27].py="caojian";   
    NameList[28].py="zhushouyuan";   
    NameList[29].py="liwei";   
       
    char *f;   
    int r,s0;   
       
    for (int 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()       
{   
    for (int i=0; i<HASH_LEN;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;   
        }   
    }   
}   
   
   
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/548991.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【掌控安全】sql注入全集

掌控安全 &#x1f525;系列专栏&#xff1a;掌控安全 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2023年5月20日&#x1f334; &#x1f36d;作者水平很有限&#xff0c;如果发现错误&…

Linux---文件操作命令(touch、cat、more)

1. touch命令 可以通过touch命令创建文件 语法&#xff1a;touch [选项] Linux路径 touch命令&#xff0c;参数必填&#xff0c;表示要创建的文件路径&#xff0c;相对、绝对、特殊路径符均可以使用。 touch 命令不光可以用来创建文件&#xff08;当指定操作文件不存在时&a…

【Redis】聊一下缓存雪崩、击穿、穿透、预热

缓存的引入带来了数据读取性能的提升&#xff0c;但是因此也引入新的问题&#xff0c;一个是数据双写一致性&#xff0c;另一个就是雪崩、击穿、穿透&#xff0c;那么如何解决这些问题&#xff0c;我们来说下对应的问题和解决方案 雪崩 缓存雪崩&#xff1a;同一时间内大量请…

pg事务:事务相关元组结构

事务相关的元组结构 元组结构中包含很多pg的mvcc所必要的信息&#xff0c;下面的内容将梳理xmin,xmax,t_ctid,cmin,cmax,combo cid,tuple id的含义和关系 物理结构 HeapTupleHeaderData相当于tuple的header&#xff0c;其结构在src/include/access/htup_details.h中定义 typ…

【BIO、NIO、AIO、Netty】

什么是IO Java中I/O是以流为基础进行数据的输入输出的&#xff0c;所有数据被串行化(所谓串行化就是数据要按顺序进行输入输出)写入输出流。简单来说就是java通过io流方式和外部设备进行交互。在Java类库中&#xff0c;IO部分的内容是很庞大的&#xff0c;因为它涉及的领域很广…

win--C盘程序员常见应用内存空间处理

写在前面&#xff1a; 本篇用于记录我对于C盘各个应用内存处理的总结&#xff0c; 文章目录 前置知识vscode的.vscode文件迁移可以移动 软件推荐wsl和docker存储管理修改安装目录压缩磁盘 pip缓存清理JetBrains系列 前置知识 在win中有着这样一个命令mklink&#xff0c;可以…

Java飞行记录器

目录 JFR和JMC启动飞行记录用JFR对比不同GC器运行结果记录结果GC配置GC Summary垃圾收集 JFR和JMC JFR全称为Java Flight Recorder&#xff0c;即Java飞行记录器 JMC全称为JDK Mission Control&#xff0c;即JDK任务控制 先贴一段官网的简介&#xff1a; Java Flight Recorder…

基于鸿蒙系统的智能衣柜管理系统设计与实现_kaic

摘 要 随着城市的扩大与科学技术的发展&#xff0c;人们逐渐开始关注衣柜功能的改进&#xff0c;存储效果的优化和智能使用的升级。个性化、功能化、智能化的衣柜将出现在人们的家庭生活中&#xff0c;并且起到重要作用。 为了满足当前人们对智能衣柜的需求&#xff0c;本设计…

面试真的被问麻了......

前几天组了一个软件测试面试的群&#xff0c;没想到效果直接拉满&#xff0c;看来大家对面试这块的需求还是挺迫切的。昨天我就看到群友们发的一些面经&#xff0c;感觉非常有参考价值&#xff0c;于是我就问他还有没有。 结果他给我整理了一份非常硬核的面筋&#xff0c;打开…

Java -并发(多线程)-Interview面试题收集

1、多线程并发 1&#xff09;多线程中 synchronized 锁升级的原理是什么&#xff1f; synchronized 锁升级原理&#xff1a;在锁对象的对象头里面有一个 threadid 字段&#xff0c;在第一次访问的时候 threadid 为空&#xff0c;jvm 让其持有偏向锁&#xff0c;并将 threadid…

Mabatis Plus 之ID生成策略控制(Auto、Input、assign_id、assign_uuid)

文章目录 知识点1&#xff1a;TableId1 环境构建2 代码演示AUTO策略步骤1:设置生成策略为AUTO步骤2:删除测试数据并修改自增值步骤3:运行新增方法 INPUT策略步骤1:设置生成策略为INPUT步骤2:添加数据手动设置ID步骤3:运行新增方法 ASSIGN_ID策略步骤1:设置生成策略为ASSIGN_ID步…

HTTPS的工作流程

hi,大家好,好久不见,今天为大家带来HTTPS协议的工作流程 认识HTTPS 加密是什么 HTTPS的工作流程 1.认识HTTPS HTTPS也是应用层协议,让我们再来回忆一下TCP/IP五层协议模型 HTTPS 也是一个应用层协议. 是在 HTTP 协议的基础上引入了一个加密层. HTTP协议在传输的时候是以…

2023河海大学838计算机学硕考研高分经验分享

大家好&#xff0c;我是陪你考研每一天的大巴学长。 大巴学长为大家邀请到了2023年838计算机学硕初试第二名的高分学长&#xff0c;为大家分享一下他的考研经验&#xff0c;经验里详细介绍了各科的复习方法&#xff0c;很有参考意义。 希望对大家有所借鉴和帮助&#xff0c;在…

C++13-STL模板-01向量(vector)

C13-STL模板 在线练习&#xff1a; http://noi.openjudge.cn/ https://www.luogu.com.cn/ 大纲要求 【 3 】算法模板库中的函数&#xff1a;min、max、swap、sort 【 4 】栈 (stack)、队列 (queue)、链表 (list)、 向量&#xff08;vector&#xff09;等容器 1.函数模板 泛…

HNU数据结构与算法分析-作业1-算法分析

1. (简答题) 1.&#xff08;教材3.4&#xff09;&#xff08;a&#xff09;假设某一个算法的时间代价为 &#xff0c;对于输入规模n&#xff0c;在某台计算机上实现并完成该算法的时间为t秒。现在另有一台计算机&#xff0c;运行速度为第一台的64倍&#xff0c;那么t秒内新机器…

FreeRTOS(5)----互斥量

一&#xff0c;互斥信号量 互斥信号量是一个具有优先级继承的二值信号量&#xff0c;在同步的应用中二值信号量最合适。互斥信号量适合互斥访问的那些应用。在互斥访问中互斥信号量相当于一个钥匙&#xff0c;当一个任务使用这个资源&#xff0c;资源就会被上锁&#xff0c;防…

[CTF/网络安全] 攻防世界 robots 解题详析

[CTF/网络安全] 攻防世界 robots 解题详析 robots.txt姿势总结 题目描述&#xff1a;X老师上课讲了Robots协议&#xff0c;小宁同学却上课打了瞌睡&#xff0c;赶紧来教教小宁Robots协议是什么吧。 进入靶机&#xff0c;页面空白。 查看页面源代码&#xff1a; 再次结合题目Rob…

Java常用工具之StringUtils类

目录 一、字符串判空二、分隔字符串三、判断是否为纯数字四、将集合拼接成字符串五、其他方法 字符串&#xff08;String&#xff09;在我们的日常工作中&#xff0c;用得非常非常非常多。 在我们的代码中经常需要对字符串判空&#xff0c;截取字符串、转换大小写、分隔字符串、…

chatgpt赋能Python-python3_取模

Python3 取模&#xff1a;介绍与使用 在Python3中&#xff0c;取模运算是比较常用的运算符。本文将介绍Python中的取模运算符&#xff0c;并分享多种使用取模运算符的方法。 什么是取模运算符 在数学上&#xff0c;取模运算是将一个整数除以另一个整数&#xff0c;然后返回相…

后端传到前端的JSON数据大写变小写--2023

问题复现&#xff1a;1. 首先我先说一下&#xff0c;我用了lombok&#xff0c;事实证明和这个也有关系 前端这里写的也是按照驼峰命名来写的 控制台打印出来的数据 后台打印出来的数据 解决方法&#xff1a; 1. 重写get/set方法 因为我在实体类上标注了Data注解 重写get/se…