1 课题描述

针对某个集体中人名设计一个哈希表,使得平均查找长度不超过2,并完成相应的建表和查表程序。

2 问题分析和任务定义

1)假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有30个,取平均查找长度的上限为2。
2)哈希函数用除留余数法构造,用线性探测再散列法或链地址法处理冲突。
3) 在输入人名过程中能自动识别非法输入,并给与非法输入的反馈信息要求重新输入。
4)查找成功时,显示姓名及关键字,并计算和输出查找成功的平均查找长度

3 逻辑设计

1)数据类型:

对于名字中包含的信息,名字的拼音使用字符串类型保存,由拼音字母ascll构成的关键字使用整数型保存。对于哈希表所包含的信息,姓名使用字符串类型保存,关键字使用整数型保存,哈希表中的元素使用整数类型保存。
struct name///名字结构体
{
char s[30];
int v;///ascll码值之和
} NAME[N];
struct hashs///哈希表结构体
{
char name[30];///名字
int key;///关键字
int sum;///哈希表中含有的元素个数
} HASH[M];

2)抽象数据类型:

ADT Hash {
数据对象D:D是具有相同特征的数据元素的集合。各数据元素均含有类型相同,可唯一标识数据元素的关键字。
数据关系R:数据元素同属一个集合。
init()
操作结果:初始化姓名表。
creathash()
操作结果:建立哈希表。
displayhash()
操作结果:显示哈希表。
display()
操作结果:显示姓名表。
searchhash()
操作结果:查找姓名。
}ADT Hash

3)模块功能:

功能上主要分为初始化姓名表,构建哈希表,显示姓名表,显示哈希表,从哈希表中
查找姓名这五大功能。其中构建哈希表使用除留余数法构建,并用线性探测再散列的方法解决冲突。

4 详细设计

const int N=30;
const int M=50;
struct name///名字结构体
{
char s[30];
int v;///ascll码值之和
} NAME[N];
struct hashs///哈希表结构体
{
char name[30];///名字
int key;///关键字
int sum;///哈希表中含有的元素个数
} HASH[M];

<1>初始化函数:void init()
读取姓名信息,初始化成姓名表。

<2>创建哈希表函数:void creathash()
将读取信息建立的姓名表建立哈希表。

<3>演示哈希表函数:void displayhash()
打印哈希表中的信息。

<4>演示姓名表函数:void display()
打印姓名表中的信息。

<5>查找哈希表中的姓名函数 void searchhash()
按照输入的姓名查找其在哈希表中的位置,并打印信息。

5 程序编码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=30;
const int M=50;
struct name   //名字结构体
{char s[30];int v;   //ascll码值之和
} NAME[N];
struct hashs   //哈希表结构体
{char name[30];   //名字int key;   //关键字int sum;   //哈希表中含有的元素个数
} HASH[M];
void init()   //初始化
{int i,j,sum;for(i=0; i<N; i++){NAME[i].v=0;}strcpy(NAME[0].s,"houhuiyu");//侯慧玉strcpy(NAME[1].s,"liutongxuan");//刘同轩strcpy(NAME[2].s,"liujiyuan");//刘继源strcpy(NAME[3].s,"wuzhe");//吴哲strcpy(NAME[4].s,"yaofanqi");//姚蕃淇strcpy(NAME[5].s,"sunchuwen");//孙楚旻strcpy(NAME[6].s,"songmingxue");//宋明雪strcpy(NAME[7].s,"zhangyongfei");//张勇飞strcpy(NAME[8].s,"zhangnanshuang");//张楠爽strcpy(NAME[9].s,"xumingyan");//徐明燕strcpy(NAME[10].s,"zengguangxun");//曾广巡strcpy(NAME[11].s,"liyong");//李勇strcpy(NAME[12].s,"liwenyao");//李文瑶strcpy(NAME[13].s,"lichenchuangyi");//李陈创一strcpy(NAME[14].s,"yangbinxu");//杨滨旭strcpy(NAME[15].s,"sangtianqi");//桑天奇strcpy(NAME[16].s,"lianghongting");//梁宏婷strcpy(NAME[17].s,"wangfuqiang");//王富强strcpy(NAME[18].s,"wanghongyuan");//王洪远strcpy(NAME[19].s,"wangtongshu");//王童姝strcpy(NAME[20].s,"wangpeng");//王鹏strcpy(NAME[21].s,"aizhanpeng"); //艾展鹏strcpy(NAME[22].s,"yuanyuan");//袁媛strcpy(NAME[23].s,"hexinlin");//贺薪霖strcpy(NAME[24].s,"xinghongxuan");//邢鸿轩strcpy(NAME[25].s,"guofanshu");//郭芃妤strcpy(NAME[26].s,"chenxuyan");//陈旭艳strcpy(NAME[27].s,"hanyutao");//韩玉涛strcpy(NAME[28].s,"lushiteng");//鹿世腾strcpy(NAME[29].s,"huangqichang");//黄启昌for(i=0; i<N; i++){sum=0;for(j=0; j<strlen(NAME[i].s); j++){sum=sum+(NAME[i].s[j]-'a');}NAME[i].v=sum;   //名字字母ascll码之和}
}
void creathash()    //构造哈希表
{int i;int n,m,counts;for(i=0; i<M; i++){strcpy(HASH[i].name,"0");HASH[i].key=0;HASH[i].sum=0;}for(i=0; i<N; i++){counts=1;n=(NAME[i].v)%47;m=n;if(HASH[n].sum==0)   //不冲突{strcpy(HASH[n].name,NAME[i].s);HASH[n].key=NAME[i].v;HASH[n].sum=1;}else   //如果发生了冲突{while(1){m=(m+1)%47;counts++;if(HASH[m].key==0){break;}}strcpy(HASH[m].name,NAME[i].s);HASH[m].key=NAME[i].v;HASH[m].sum=counts;}}return ;
}
void searchhash()
{char name[30];int i,sum,n,m,counts;sum=0;n=0;counts=1;printf("请输入要查找人的姓名拼音:\n");scanf("%s",name);for(i=0; i<strlen(name); i++){sum+=(name[i]-'a');}n=sum%47;m=n;if(strcmp(HASH[n].name,name)==0){printf("姓名:%s 关键字:%d 查找长度:1\n",HASH[n].name,sum);}else if(HASH[n].sum==0){printf("没有找到这条记录!!!\n");}else{while(1){m=(m+1)%47;counts++;if(strcmp(HASH[m].name,name)==0){printf("姓名:%s 关键字:%d 查找长度:%d\n",HASH[m].name,sum,counts);break;}if(HASH[m].key==0){printf("没有找到这条记录!!!\n");break;}}}
}
void displayhash()   //演示哈希表
{int i,sum;float ave;ave=0.0;sum=0;printf("\n地址\t关键字\t\t搜索长度\t姓名\n");for(i=0; i<M; i++){printf("%d",i);printf("\t%d",HASH[i].key);printf("\t\t%d",HASH[i].sum);printf("\t%s",HASH[i].name);printf("\n");}for(i=0; i<M; i++){sum+=HASH[i].sum;}ave=((sum)*1.0)/N;printf("\n");printf("平均查找长度ASL(%d)=%.3lf\n",N,ave);return ;
}
void display()
{int i;for(i=0; i<30; i++){printf("\n\t关键字\t\t姓名\n");printf("\t%d",NAME[i].v);printf("\t%s",NAME[i].s);}return ;
}
int menu()
{printf("\n\n");printf("\t汉字姓名拼音哈希表展示查找系统\n");printf("\t1.展示姓名拼音和关键字\n");printf("\t2.展示哈希表\n");printf("\t3.查找关键字\n");printf("\t4.退出\n");printf("\n");printf("\n");return 0;
}
int main()
{int n;int flag;flag=1;while(1){menu();if(flag==1){init();creathash();flag=0;}scanf("%d",&n);getchar();if(n<1||n>4){printf("输入有误,请重新输入!!!\n");continue;}else{if(n==1){printf("展示所准备的姓名拼音及其所组成的关键字:\n");display();}else if(n==2){displayhash();}else if(n==3){searchhash();}else if(n==4){return 0;}}}return 0;
}

6 程序调试与测试

1)打印姓名表:

2)打印哈希表

3)查找姓名:

7 结果分析

时间复杂度在没有冲突时是O(1),实际上要根据冲突多少来确定,最差情况下会退化成O(n)。空间复杂度是O(n)。

数据结构实训——哈希表设计相关推荐

  1. 数据结构基础(18) --哈希表的设计与实现

    哈希表 根据设定的哈希函数 H(key)和所选中的处理冲突的方法,将一组关键字映射到一个有限的.地址连续的地址集 (区间) 上,并以关键字在地址集中的"映像"作为相应记录在表中的存 ...

  2. c语言点菜菜单程序大学一,数据结构实训报告 c语言点餐系统 net

    <数据结构实训报告 c语言点餐系统 net>由会员分享,可在线阅读,更多相关<数据结构实训报告 c语言点餐系统 net(14页珍藏版)>请在人人文库网上搜索. 1.北京联合大学 ...

  3. c语言点餐系统测试总结报告,数据结构实训报告c语言点餐系统net

    数据结构实训报告c语言点餐系统net (23页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 北京联合大学数据结构实训报告课程名称 项目名称 ...

  4. educoder实训平台----简历表页面的制作

    educoder实训平台----简历表页面的制作 第1关:简历表页面的结构设计 <!doctype html> <html> <head> <meta cha ...

  5. c语言数据结构对学生信息折半查找,数据结构实训报告-二分查找学生管理实训报告.doc...

    数据结构实训报告-二分查找学生管理实训报告 吉林工业职业技术学院 ( 数据结构实训 ) ( 20~ 2012 学年第 学期) 指导教师: 专业班级: 计算机3101 学生姓名: 2011年月日实训项目 ...

  6. HTML实训大作业网页设计:我的简历——响应式个人简历网站模板(1页) HTML+CSS+JavaScript web网页设计制作成品

    HTML实训大作业网页设计:我的简历--响应式个人简历网站模板(1页) HTML+CSS+JavaScript 期末作业HTML代码 学生网页课程设计期末作业下载 web网页设计制作成品 >&g ...

  7. 数据结构实验:哈希表

    数据结构实验:哈希表 题目描述 在n个数中,找出出现次数最多那个数字,并且输出出现的次数.如果有多个结果,输出数字最小的那一个. 输入 单组数据,第一行数字n(1<=n<=100000). ...

  8. 唯众综合布线实训室设备配置表

    唯众综合布线实训室设备配置表 转载至http://www.whwzzc.com/main/recentNews?id=26&type=solution

  9. HTML淘宝网的制作实训关键点,《网页设计与制作》实训指导书.doc

    <网页设计与制作>实训指导书<网页设计与制作>实训指导书 <网页设计与制作> 实 训 指 导 书 主编:王春艳 <网页设计与制作>实训指导书 目 录 一 ...

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

    文章目录 核心代码 链表节点定义 链地址法处理冲突 查询函数 完整代码下载 核心代码 哈希表使用「链地址法」解决地址冲突的方式,其数据结构就采用 数组+链表 ,数组的每一个元素都是一个链表节点,当地址 ...

最新文章

  1. 陈立杰再获FOCS 2019最佳学生论文奖
  2. 二值化每个特征,微软用1350亿参数稀疏神经网络改进搜索结果
  3. MongoDB数据库(3.mongodb数据库的高级查询)
  4. Tomcat监控xml ,当修改xml后,不用重启tomcat
  5. FFMPEG 图像拉伸缩放及数据格式转换
  6. sql 命令未正确结束_渗透测试之SQL注入(1)
  7. 【Arduino】OTTO机器人(做二次开发的一点点总结)
  8. Python 3 与 Javascript escape 传输确保数据正确方法和中文乱码解决方案
  9. HTML结构:自我简介页面
  10. 用Java写一个递归遍历目录下面的所有文件
  11. vm14远程连接服务器,VisualVM 远程连接服务器
  12. (2)量化交易学习-股票数据下载
  13. java学生管理系统,(史上最全)
  14. android app 尺寸,Android APP标注尺寸入门教程和app标注工具
  15. linux resin目录,Linux下resin的安装以及配置:
  16. [rock]Life ’s A Struggle -宋岳庭(转)
  17. python竖线_python 读取竖线分隔符的文本方法
  18. 【机智云专题】①:乐鑫esp8266巧用机智云自动代码生成功能,移植加入驱动单路继电器,实现智能定时插座。(附带demo)
  19. pdf合并成一个pdf怎么合并
  20. 在电脑上打开手机当前浏览的网页

热门文章

  1. cuda10.2+ubuntu18.04+docker视频编解码
  2. WIN10系统 screencap截图屏幕会自动放大怎么办
  3. js获取html的ip,JavaScript获取客户端IP
  4. 奇妙“水仙花数”的判断
  5. SQL行列转换-sum函数的妙用
  6. Unity 下载安装Standard Assets
  7. 阿里巴巴矢量图标引入方法
  8. sql server收缩数据库日志
  9. 清除SQL Sever 2008数据库日志
  10. 2.4G ISM CC2500设计