大连理工大学哈希表设计.docx
- 文档编号:5489105
- 上传时间:2022-12-17
- 格式:DOCX
- 页数:17
- 大小:169.93KB
大连理工大学哈希表设计.docx
《大连理工大学哈希表设计.docx》由会员分享,可在线阅读,更多相关《大连理工大学哈希表设计.docx(17页珍藏版)》请在冰豆网上搜索。
大连理工大学哈希表设计
大连理工大学
数据结构课程设计报告
题目:
哈希表的设计与实现
院(系):
计算机工程学院
专业:
计算机科学与技术
班级:
计科1091
学生:
周小晴
指导教师:
寇海洲孙成富
邱军林殷路
2012年10月
目录
一、设计目的3
二、设计内容3
三、程序设计步骤13
四、调试分析14
五、测试结果16
六、课程设计小结17
一、设计目的
1、能根据实际问题的具体情况,结合数据结构课程中的基本理论和基本算法,分析并正确确定数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法。
2、提高程序设计和调试能力。
学生通过上机实习,验证自己设计的算法的正确性。
学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。
3、初步掌握软件开发过程中问题分析、系统设计、程序编码、测试等基本方法和技能。
4、训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
5、培养根据选题需要选择学习书籍,查阅文献资料的自学能力。
二、设计内容
1、系统名称:
哈希表的设计与实现
2、要求:
(1)设每个记录有下列数据项:
电话号码、用户名、地址;
(2)从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表;
(3)采用再哈希法解决冲突;
(4)查找并显示给定电话号码的记录;
(5)查找并显示给定用户的记录。
(6)在哈希函数确定的前提下,尝试各种不同类型的处理冲突的方法(至少两种),考察平均查找长度的变化。
三、程序设计步骤
1)Hash函数结构流程图。
(1)以号码为关键字的hash函数流程图
(2)以姓名为关键字的hash函数流程图
(3)添加信息节点流程图
(4)姓名查找流程图
(5)号码查询流程图
2)采用主要的数据结构类型。
1、电话号码哈希函数
voidhash(charnum[11])
{
//printf("在hash函数内部执行");
inti=2;
key=(int)num[1];
while(num[i]!
=NULL)
{
key+=(int)num[i];
i++;
}
key=key%20;
}
2、姓名哈希函数
voidhash2(charname[20])
{
inti=1;
key2=(int)name[0];
while(name[i]!
=NULL)
{
key2+=(int)name[i];
i++;
}
key2=key2%20;
}
3、再哈希函数
voidrehash(charnum[11])
{
inti=1;
key=(int)num[0];
while(num[i]!
=NULL)
{
key+=(int)num[i];
i++;
}
key=(key+i)%20;
}
boolreclash()
{
node*q=phone[key]->next;
if((q->name)!
=NULL)
returntrue;
else
returnfalse;
}
4、电话号码冲突处理
voidclash()
{
//电话号码冲突处理
node*q=phone[key]->next;
while((q->name)!
=NULL)
{
key=key+1;
q=phone[key]->next;
}
}
5、姓名冲突处理
voidclash2()
{
node*q=nam[key2]->next;
while((q->name)!
=NULL)
{
key2=key2+1;
q=nam[key2]->next;
}
}
6、姓名冲突处理后的查找
voidfind02(charname[20])
{
hash(name);
node*q=nam[key2]->next;
if(q==NULL)
{
printf("\n无此记录\n\n");
}
else
{
while(q!
=NULL)
{
if(strcmp(name,q->name)==0)
{
printf("\n\n|----------------------------|\n");
printf("姓名:
%s\n",q->name);
printf("地址:
%s\n",q->address);
printf("电话:
%s\n",q->num);
printf("|----------------------------|\n\n\n");
}
if(key2>0)
{
key2=key2-1;
}
q=nam[key2]->next;
}
}
}
7、电话号码冲突处理后的查找
voidfind01(charnum[11])
{
hash(num);
node*p=phone[key]->next;
if(p==NULL)
{
printf("\n无此记录\n\n");
}
else
{
while(p!
=NULL)
{
if(strcmp(num,p->num)==0)
{
printf("\n\n|----------------------------|\n");
printf("姓名:
%s\n",p->name);
printf("地址:
%s\n",p->address);
printf("电话:
%s\n",p->num);
printf("|----------------------------|\n\n\n");
}
if(key<20)
{
key=key+1;
}
p=phone[key]->next;
}
}
}
3)各软件模块之间的调用方式
该软件各个模块的调用主要是通过声明函数,和定义函数,再通过主函数调用实现的。
主函数:
intmain()
{
charnum[11];
charname[20];
create();
create2();
intsel;
while
(1)
{
menu();
scanf("%d",&sel);
if(sel==2)
{
printf("9号码查询\n8姓名查询\n");
intb;
scanf("%d",&b);
if(b==9)
{
printf("请输入电话号码:
\n");
scanf("%s",&num);
printf("\n输出查找的信息:
\n\n");
find01(num);
}
else
{
printf("请输入姓名:
\n");
scanf("%s",&name);
printf("\n输出查找的信息:
\n\n");
find02(name);
}
}
if(sel==3)
{
printf("姓名散列结果:
\n");
list2();
}
if(sel==1)
{
printf("请输入要添加的内容:
\n");
apend();
}
if(sel==4)
{
printf("号码散列结果:
\n");
list();
}
if(sel==5)
{
printf("列表已清空:
\n");
create();
create2();
}
if(sel==6)return0;
}
return0;
}
四、调试分析
调试的过程中,由于address[20]、name[8]和num[11]可以看出地址可输入的最大字符数是20,姓名可输入的最大字符数是8,电话号码都为11位。
容易输错,希望操作者注意。
五、测试结果
1、进入演示程序后,即显示主界面为:
查找记录:
姓名散列
号码散列:
清空记录:
六、课程设计小结:
一周的课程设计今天结束了。
很快,收获很多。
感觉像是一个从无到有的过程,非常的充实。
我做的课题是“哈希表问题”。
基本算法老师在课堂上有涉及过,但具体的还要靠自己去钻研。
我在一边做上机实验时,一边到图书馆查阅书籍,反复实践操作,往往比书本上得到的更多,体会也更深刻。
通过本次课程设计对哈希表问题有了一个比较全面的认识和了解。
哈希表问题,在存储位置和关键字之间建立对应关系f,根据对应关系f找到定值K。
若结构中存在关键字和定值K相等的记录,必定在f(K)的存储位置上,由此可以省去比较过程,直接找到所查记录。
哈希表其实不难,课程设计考验的是我们的学习态度,独立思考问题,和解决问题的能力。
把握这次机会肯定大有收获。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 大连理工大学 哈希表 设计