数据结构电话码查询系统设计报告及代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
郑州轻工业学院
课程设计任务书
题目电话号码查询系统
专业、班级计科10-01学号41姓名王平
主要内容:设计哈希表实现电话号码查找系统
基本要求:从键盘输入各记录,分别以电话号码和用户名为关键字设计哈希表;采用不同的哈希函数,比较冲突率;采用适当的方法解决冲突;在哈希函数确定的前提下,尝试不同类型处理冲突的方法,考察平均查找长度的变化;查找并显示给定电话号码的记录;查找并显示给定用户名的记录。
主要参考资料等:数据结构课本(c语言版)
完成期限:21012年6月21号
指导教师签名:
课程负责人签名:
12年 6 月 21 日
郑州轻工业学院本科
数据结构课程设计总结报告
设计题目:电话号码查询系统
学生姓名:王平
系别:计算机科学与通信工程学院
专业:计算机科学与技术
班级:10-01
学号:41
指导教师:卢冰、李晔
2012年 6月 21 日
设计题目
题目:电话号码查询系统
每个记录有下列数据项:电话号码、用户名、地址;从键盘输入各记录,分别以电话号码和用户名为关键字设计哈希表;采用不同的哈希函数,比较冲突率;采用适当的方法解决冲突;在哈希函数确定的前提下,尝试不同类型处理冲突的方法,考察平均查找长度的变化;查找并显示给定电话号码的记录;查找并显示给定用户名的记录。
运行环境(软、硬件环境)
Vc6.0
算法设计的思想
电话号码查询系统主要是考察我们对哈希查找的掌握。
题目要求用电话号码和姓名两种方式查找;第一大部份是用电话号码查找,第二部分是用姓名查找。
1:电话号码查找(先建立哈希表读入数据,然后再处理冲突,查找):在这部分中,我用了除留取余法和数字分析法设计的哈希表,用的是开放定址法进行的冲突处理。除留取余法思想:取关键字被某个不大于哈希表表长的数p除后所得余数为哈希地址即:H(key)=key%p。数字分析法:已知关键字是以r为基础的数,哈希表中出现的关键字是事先知道的,选择关键字是候,我们应该尽量避免冲突。开放地址法:开放地址法主要公式;H=(H+di)%m,di的取法有三种,但是我的程序中只用到了线性探测在散列,本可以用再哈希函数解决冲突的,但是考虑到再哈希函数会增加计算时间,所以就没用。
2:姓名查找(先建立哈希表读入数据,然后再处理冲突,查找)方式:这个过程中,我选取了数字分析法,解释如上。
主菜单的设计在设计效果上已经显示,不过多说明。
主菜单建立->除留取余和数字分析法存储->开放地址法解决冲突->查找。
算法设计分析
这段代码是哈希存储时从第三个数开始求,提高了代码效率。int i = 3;
while(s.num[i]!='\0') //关键字
{
key+=(s.num[i]-'0'); //关键字求和
i++;
}
key=key%21;
线性探测再散列处理冲突
if(!strcmp(W.t[key].num,""))//查找,解决冲突W.t[key]=s;
else
{//第一次没解决彻底,继续解决冲突
int j=1;
while(strcmp(W.t[(key+j)%21].num,"")) j++;
W.t[(key+j)%21]=s;
}
}
查找代码;
while(xnum[i]!='\0')
{
key+=(xnum[i]-'0'); //求和
i++;
}
key=key%21;
if(!strcmp(W.t[key].num,xnum))//第一次查找,如果值相等直接赋值
printf("%s %s %s\n",W.t[key].name,W.t[key].addres s,W.t[key].num);
else
{//第一次没找到,继续查找
int j=1;
while(strcmp(W.t[(key+j)%21].num,xnum)) j++;
if(j==20)
printf("查找元素不存在!");
else
printf("%s %s %s\n",W.t[(key+j)%21].name,W.t[(key +j)%21].address,W.t[(key+j)%21].num);//输出查找到得元素
}
主界面:
printf("********电话号码查询系统********\n");
printf(" 用电话号码查询 1 \n");
printf(" 用用户名查询 2 \n");
printf("********************************\n");
printf("请输入您要的选项:\n");
int x,y;
while(scanf("%d",&x)!=-1)
{
if(x==1)
{
printf("********电话号码查询********\n");
printf(" 除留取余法 1 \n");
printf(" 数字分析法 2 \n");
printf("****************************\n");
printf("请输入y值:\n");
scanf("%d",&y);
while(y<3)
{
switch(y)
{
case 1:chuliu();break;//调用除留取余函数 case 2:shuzi();break;//调用数字分析函数 default:printf("输入指令不存在!\n");
}
printf("********电话号码查询********\n");
printf(" 除留取余法 1 \n");
printf(" 数字分析法 2 \n");
printf("****************************\n");
printf("请输入您要的选项:\n");
scanf("%d",&y);