数据结构实验报告.docx
《数据结构实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告.docx(18页珍藏版)》请在冰豆网上搜索。
![数据结构实验报告.docx](https://file1.bdocx.com/fileroot1/2023-2/2/91bfc384-6892-4783-82be-2f7195b8ae5c/91bfc384-6892-4783-82be-2f7195b8ae5c1.gif)
数据结构实验报告
数据结构
实
验
报
告
学院:
计算机科学学院
专业:
软件工程
班级:
12级软件工程
(2)班
组长:
成旭飞
组员:
赵航耿梦鸽王静王利
班级:
软件工程02班
组员:
41209050202成旭飞解决冲突
41209050222赵航输入输出
41209050227耿梦鸽初始化
41209050229王静哈希函数
41209050230王利查找
完成日期:
2014年1月8日
1.题目:
设计散列表实现电话号码查找系统
2.问题描述及分析:
(1)设每个记录下有下列数据项:
电话号码,用户名,地址;
(2)从键盘输入个记录,分别以电话号码和用户名为关键字建立散列表;
(3)采用双散列法解决冲突;
(4)查找并显示给定电话号码的记录;
(5)查找并显示给定用户名的记录;
(6)显示所有录入用户的信息。
3需求分析:
本演示程序用C++语言编写,利用哈希法完成对电话查找和姓名查找,整个系统主要分为两大模块,录入模块和查询模块。
录入模块可根据系统提示的信息进行填写,按回车存储,以姓名和电话号码为关键字分别用哈希函数运算出一个相应的值,把这个值作为结点的存储地址,分别存入姓名散列表和电话号码散列表的对应位置。
查询模块分为两部分,姓名查询和电话号码查询,姓名查询可有一个姓名查到多个记录,号码查询是一一映射,查找时,通过所要的关键字用同样的哈希函数计算地址,判断存的内容是否跟关键字一样,若一样则记录找到你要查找的内容,否则无此记录。
要求:
记录有下每个数据项:
电话号码、用户名、地址;
从键盘输入各记录,分别以电话号码和用户为关
键字建立散列表;
采用一定的方法解决冲突;
查找并显示给定电话号码的记录;
查找并显示给定用户名的记录;
输入的形式姓名和电话都以字符串的形式表示;
3.设计概要:
本程序包含8个函数:
1)初始化函数:
create(),create2()
2)用于操作运算的哈希函数:
hash(),hash2()
3)查找信息函数:
find(),find2()
4)单链表解决冲突函数:
apend()
5)输入节点信息函数:
input()
6)输出列表函数:
list()
7)显示操作菜单函数:
menu()
8)主函数:
main()
各函数关系如下所示:
create1/create2apend
find1/find2hash1/hash2
Maininput
list
Menu
4.详细设计:
结点类型和指针类型
typedefnode*pnode;
typedefnode*mingzi;
node**phone;
node**nam;
node**a;
哈希表的操作:
voidhash()电话号码求和后哈希
voidhash2()姓名强制类型转换求和后哈希
voidfind()电话关键字查找
voidfind2()姓名关键字查找
intapend()添加新用户
5.调试分析:
(1)哈希函数没有设好,使用了数组各个字符相加,在运行时算的散列地址出现负值,而使得记录无法正常的存储到散列表中,后来使用了第一位和第三位之和可使散列地址始终为正值。
(2)在查找过程中循环条件没有设好,尤其是注意对字符串的比较strcmp函数返回值,程序成死循环。
(3)对文件的操作过程中碰到很多问题,在打开文件的过程中,刚开始使用了录入一个记录就读进文件,浪费了很多时间,后来采用程序调用前把文件的内容读出到散列表,在程序运行结束时,把记录读入文件减少了大量的时间。
#include"iostream.h"
#include"string.h"
#defineNULL0
#defineX20//哈希表长
unsignedintkey;
unsignedintkey2;
structnode//节点结构体
{
charname[8],address[20];
charnum[11];
node*next;
};
typedefnode*pnode;
typedefnode*mingzi;
node**phone;
node**nam;
node**a;
voidhash(charnum[11])//对电话哈希
{
inti=2;
key=(int)num[1];//强制类型转换
while(num[i]!
=NULL)
{
key+=(int)num[i];
i++;
}
key=key%19;
}
voidhash2(charname[8])//对姓名哈希函
{
inti=1;
key2=(int)name[0];
while(name[i]!
=NULL)
{
key2+=(int)name[i];
i++;
}
key2=key2%19;//哈希函数
}
node*input()//输入节点信息
{
node*temp;
temp=newnode;
temp->next=NULL;
cout<<"输入姓名:
"<cin>>temp->name;
cout<<"输入地址:
"<cin>>temp->address;
cout<<"输入电话:
"<cin>>temp->num;
returntemp;
}
intapend()//添加新节点采用链地址法解决冲突。
{
node*newphone;
node*newname;
newphone=input();
newname=newphone;
newphone->next=NULL;
newname->next=NULL;
hash(newphone->num);
hash2(newname->name);
newphone->next=phone[key]->next;
phone[key]->next=newphone;//关键字相同则指向下一个结构体地址
newname->next=nam[key2]->next;
nam[key2]->next=newname;
return0;
}
voidcreate()//新建节点并初始化
{
inti;
phone=newpnode[X];//申请结构体数组
for(i=0;i{
phone[i]=newnode;
phone[i]->next=NULL;
}
}
voidcreate2()//新建节点并初始化
{
inti;
nam=newmingzi[X];//申请结构体数组
for(i=0;i{
nam[i]=newnode;
nam[i]->next=NULL;
}
}
voidlist()//显示列表
{
inti;
node*p;
for(i=0;i{
p=phone[i]->next;//输出电话结构体数组中的用户
while(p)
{
cout<<"用户姓名:
"<cout<name<cout<<"用户地址:
"<cout<address<cout<<"用户电话:
"<cout<num<cout<p=p->next;
}
}
}
voidfind(charnum[11])//电话查找用户信息
{
hash(num);
node*q=phone[key]->next;//直接指向关键字的位置
while(q!
=NULL)
{
if(strcmp(num,q->num)==0)
break;
q=q->next;//若不同指向下一个关键字地址
}
if(q){
cout<<"用户姓名:
"<cout<name<cout<<"用户地址:
"<cout<address<cout<<"用户电话:
"<cout<num<}
elsecout<<"无此记录"<}
voidfind2(charname[8])//姓名查找用户信息
{
hash2(name);
node*q=nam[key2]->next;
while(q!
=NULL)
{
if(strcmp(name,q->name)==0)
break;
q=q->next;
}
if(q){
cout<<"用户姓名:
"<cout<name<cout<<"用户地址:
"<cout<address<cout<<"用户电话:
"<cout<num<}
elsecout<<"无此记录"<}
voidmenu()//菜单
{
cout<<"1.姓名查找"<cout<<"2.号码查找"<cout<<"3.显示所有用户"<cout<<"0.退出系统"<}
main()
{
intN,i;
charnum[11];
charname[8];
create();
create2();
cout<<"输入用户数量:
"<cin>>N;
for(i=0;iapend();
}
inta;
while
(1)
{
menu();
cin>>a;
if(a==1)
{cout<<"请输入姓名:
"<cin>>name;
cout<<"输出查找的信息:
"<find2(name);
}
elseif(a==2)
{cout<<"请输入电话号码:
"<cin>>num;
cout<<"输出查找的信息:
"<find(num);
}
elseif(a==3)list();
elsereturn0;
}
return0;
}
6.使用说明:
选择1:
按用户姓名查找
选择2:
按用户电话号码查找
选择3:
显示所有用户的信息
选择0:
退出程序
7.调试结果:
输入三个用户的信息,包括姓名,住址和电话。
(1)选择1:
按姓名查找
(2)选择2:
按号码查找
(3)选择3:
显示所有用户
(4)选择0:
退出程序
8.设计心得
成旭飞:
这次的课程设计,加强了我们动手、思考和解决问题的能力。
巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力。
培养了我选用参考书,查阅手册及文献资料的能力。
通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法和工程设计方法。
而且做课程设计同时也是对课本知识的巩固和加强,平时看课本时,有些问题就不是很能理解,做完课程设计,那些问题就迎刃而解了。
而且还可以记住很多东西。
认识来源于实践,实践是认识的动力和最终目的,实践是检验真理的唯一标准。
所以这个期末测试之后的课程设计对我们的作用是非常大的。
赵航:
经过本次课程设计实验,首先我的团队合作意识加强了,再者,对我的知识有了一个深层次的检查,在实验的过程中,我负责哈希函数部分程序的编写,哈系函数的部分,它是在数组的基础上实现快速去查找的函数。
在编写的过程中,由于对知识掌握的不够全面,没有很快的完成任务,最后在其他几个同学的帮助下完成了自己的这部分以及我们五部分程序的连接。
这门课结束后,我总结到了学习中的遇到的一些问题,以后我会多加练习,熟悉并掌握这门课程。
耿梦鸽:
通过这次课程设计我熟悉三种基本的数据结构和两种数据处理的基本技术的使用,能够熟练综合运用数据结构和数据处理知识解决实际问题,并且提高了自己的动手能力及构造性思维能力,加深了对基本概念和基本技术知识的理解,掌握了软件开发过程中问题分析、系统设计、程序编码、测试等基本方法和技能。
同时,让我认识到运用语言作为数据结构和算法的描述语言对数据的存储结构和算法进行描述的重要性。
这次课程设计提高了我对实际问题的解决能力,即运用所学的知识对问题进行分析,了解问题的基本要求,以及怎样将实际问题化成数据语言的输入输出,并且用相应的知识来存储信息。
在这次试验中,我们小组的各个成员分工明确,通力合作,对于不懂的地方大家互相探讨,求同存异,取长补短,致使最后能正确写出程序,并成功运行,让我也明白了团队合作的重要性,与人正确交流的重要性。
王静:
通过这次的课程设计,不仅是我巩固了以前的知识,并在此基础上还对数据结构的特点和算法有了更深的理解,是我在这门课程的实际应用上也有了一定的提高,在这两周的学习过程中,我培养了灵活运用和组合集成所学过知识及技能来分析,解决实际问题的能力,是我体会到自身能力在实际中应用和发挥的重要性。
其次,他让我进一步熟悉了数据结构的结构特征以及语法函数和程序设计思想的过程,对我学习数据结构这门课程很有益处。
同时,在这次程序设计中,我也体会到了团队合作的重要性,从最初的查阅资料到最后程序的成功运行,我们组经历了很多也收获了很多,经过这次课程设计,我不仅学到了很多知识和技能,更重要的是我学会了如何运用所学知识去解决实际问题,最后我也深刻的认识到自己在学习方面的不足之处,我会在以后的日子里努力弥补自己的不足。
王利:
这次的课程设计加强了我动手和思考以及解决问题的能力,巩固和加深了我对数据结构的理解,综合提高了我运用本课程所学知识的能力,培养了我选用参考书查阅手册及文献资料的能力,培养我独立思考,深入研究,分析问题,解决问题的能来。
通过实际编译系统的分析设计,编程调试,掌握应用软件的分析方法和课程设计方法。
通过课程设计,使我懂得了理论与实际结合的重要性,认识到只有把所学的理论知识与上机实验相结合起来,从实验中得出结论,才能真正提高自己的实际动手能力和独立思考能力,从而正确的运用到程序中,再结合其他四位同学的程序,使得该完整的程序能够成功运行,并达到程序设计本身应该具备的功能,给使用者提供方便。