软件综合实习哈希表_软件综合实习
软件综合实习哈希表由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“软件综合实习”。
哈希表的设计实验报告
1.实验题目
针对自己班级体中的“人名”设计一个哈希表,使得平均查找长度不超过R,完成相应的建表和查表程序。
2.需求分析
假设人名为中国姓名的汉语拼音模式。待填入哈希表的人名共有30个,取平均查找长度的上限为2。哈希函数用除留余数法构造,用链表法处理冲突。测试数据:
①输入的形式和输入值的范围:输入30个人的姓名拼音,即30个字符串。
②输出的形式:将结果输出,程序自动计算查找长度的总数和平均查找长度,然后用户可以根据需求进行查找操作。
③程序所能达到的功能:在哈希函数确定的前提下用各种不同处理冲突的方法,考察平均查找长度的变化和造好的哈希表中关键字的聚集性。
3.概要设计
#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;void InitNameList()void FindList()void Display()4.详细设计
1{for(int i=0;i
int s0=0;for(int r=0;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);} void main(){ InitNameList();CreateHashList();while(1){ printf(“nn”);printf(“ 1.显示哈希表n”);printf(“ 2.查找n”);printf(“ 3.退出n”);err: char ch1;scanf(“%c”,&ch1);if(ch1=='1')Display();else if(ch1=='2')FindList();else if(ch1=='3')return;else { printf(“n请输入正确的选择!”);goto err;} } } 5.调试分析
测试数据:随机输入的30个人的姓名拼音
测试过程:输入30个人的姓名拼音,观察输出结果,并进行查找操作 测试结果: 6.使用说明
1)进入界面选择1显示哈希表,选择2为查找,选择3退出 2)再输入名字查找,再退出 7.测试结果
8.附录
#include #include #include //#include #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=“chenghongxiu”;NameList[1].py=“yuanhao”;NameList[2].py=“yangyang”;NameList[3].py=“zhanghen”;NameList[4].py=“chenghongxiu”;NameList[5].py=“xiaokai”;NameList[6].py=“liupeng”;NameList[7].py=“shenyonghai”;NameList[8].py=“chengdaoquan”;NameList[9].py=“ludaoqing”;NameList[10].py=“gongyunxiang”;NameList[11].py=“sunzhenxing”;NameList[12].py=“sunrongfei”;NameList[13].py=“sunminglong”;NameList[14].py=“zhanghao”;NameList[15].py=“tianmiao”;NameList[16].py=“yaojianzhong”;NameList[17].py=“yaojianqing”;NameList[18].py=“yaojianhua”;NameList[19].py=“yaohaifeng”;NameList[20].py=“chengyanhao”;NameList[21].py=“yaoqiufeng”;NameList[22].py=“qianpengcheng”;NameList[23].py=“yaohaifeng”;NameList[24].py=“bianyan”;NameList[25].py=“linglei”;NameList[26].py=“fuzhonghui”;NameList[27].py=“huanhaiyan”;NameList[28].py=“liudianqin”;NameList[29].py=“wangbinnian”;char *f;int r,s0;for(int i=0;i
for(r=0;*(f+r)!= ' ';r++)//方法:将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字 s0=*(f+r)+s0;NameList[i].k=s0;} } void CreateHashList(){ for(int i=0;i
HashList[d].k=NameList[i].k;HashList[d].py=NameList[i].py;HashList[d].si=sum+1;}i++;} void FindList(){ printf(“nn请输入姓名的拼音: ”);//输入姓名 char name[20]={0};scanf(“%s”,name);
int s0=0;for(int r=0;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);} } void Display(){ printf(“nn地址t关键字tt搜索长度tH(key)tt拼音 n”);//显示的格式 for(int i=0;i
float average=0;for(i=0;i
printf(“n------------------------哈希表的建立和查找----------------------”);InitNameList();CreateHashList();
while(1){ printf(“nn”);printf(“ 1.显示哈希表n”);printf(“ 2.查找n”);printf(“ 3.退出n”);
err: char ch1;scanf(“%c”,&ch1);if(ch1=='1')Display();else if(ch1=='2')FindList();else if(ch1=='3')return;else { printf(“n请输入正确的选择!”);goto err;} } }