数据结构课设通讯录系统的设计与实现哈希表.docx

上传人:b****5 文档编号:30049680 上传时间:2023-08-04 格式:DOCX 页数:23 大小:2.69MB
下载 相关 举报
数据结构课设通讯录系统的设计与实现哈希表.docx_第1页
第1页 / 共23页
数据结构课设通讯录系统的设计与实现哈希表.docx_第2页
第2页 / 共23页
数据结构课设通讯录系统的设计与实现哈希表.docx_第3页
第3页 / 共23页
数据结构课设通讯录系统的设计与实现哈希表.docx_第4页
第4页 / 共23页
数据结构课设通讯录系统的设计与实现哈希表.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

数据结构课设通讯录系统的设计与实现哈希表.docx

《数据结构课设通讯录系统的设计与实现哈希表.docx》由会员分享,可在线阅读,更多相关《数据结构课设通讯录系统的设计与实现哈希表.docx(23页珍藏版)》请在冰豆网上搜索。

数据结构课设通讯录系统的设计与实现哈希表.docx

数据结构课设通讯录系统的设计与实现哈希表

 

数据结构课设-通讯录系统的设计与实现——哈希表

课程设计(论文)任务书

软件学院学  院  软件工程专  业 班

一、课程设计(论文)题目:

 通讯录管理系统的设计与实现——哈希表

二、课程设计(论文)工作自2016年1月4日起至2016年1月10日止

三、课程设计(论文)地点:

软件测试中心(北区测试二室)

四、课程设计(论文)内容要求:

1.本课程设计的目的

⑴训练学生灵活应用所学数据结构知识,独立完成问题分析,结合课程的理论知识,

编写程序求解指定问题;

⑵初步掌握软件开发过程的问题分析、系统设计、编码、测试等基本方法和技能;

⑶提高综合运用所学的理论知识和方法独立分析和解决问题的能力,巩固、深化学

生的理论知识,提升编程水平。

2.课程设计的任务及要求

1)基本要求:

⑴要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽

象数据类型、编写上机程序和上机调试等若干步骤完成题目,最终写出完整的报告;

⑵在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率;

⑶程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释;

⑷每位同学需提交可独立运行的程序和规范的课程设计报告。

2)课程设计论文编写要求

⑴理论设计部分以课程设计论文的形式提交,格式必须按照课程设计论文标准格式

进行书写和装订;

⑵课程设计报告包括中文目录、设计任务、需求分析、概要设计、详细设计、编码

实现、调试分析、课设总结、谢辞、参考文献、附录等;

⑶设计部分应包含系统功能模块图,调试分析应包括运行截图等。

3)课程设计评分标准:

⑴学习态度:

10分;

⑵系统设计:

20分;

⑶编程调试:

20分;

⑷回答问题:

20分;

⑸论文撰写:

30分。

4)参考文献:

⑴严蔚敏李冬梅吴伟民著.数据结构(C语言版)[M].人民邮电出版社.2015.2

⑵李春葆.数据结构教程上机实验指导[M].清华大学出版社.2013.1

⑶何钦铭,冯燕等.数据结构课程设计[M].浙江大学出版社.2007.8

5)课程设计进度安排

⑴准备阶段(4学时):

选择设计题目、了解设计目的要求、查阅相关资料;

⑵程序模块设计分析阶段(4学时):

程序概要设计、详细设计;

⑶代码编写调试阶段(8学时):

程序模块代码编写、调试、测试;

⑷撰写论文阶段(4学时):

总结课程设计任务和设计内容,撰写课程设计论文。

学生签名:

2016年1月4日

6)课程设计题目具体要求:

任务:

利用哈希表完成通讯录的一般性管理工作:

(1)添加信息;

(2)显示信息:

可以按照手机或联系人的姓名拼音排序显示;

(3)查找:

用名字和手机号分别作为查找的依据,进行查找;

(4)编辑信息;

(5)删除信息;

(6)保存到文件;

要求:

(1)每条记录至少包括姓名、手机、QQ、电子邮箱、城市、邮编等信息。

(2)界面友好,演示程序以用户和计算机的对话方式进行,可反复操作。

课程设计(论文)评审意见

(1)学习态度(10分):

优( )、良( )、中( )、一般( )、差( );

(2)系统设计(20分):

优()、良( )、中( )、一般( )、差( );

(3)编程调试(20分):

优( )、良( )、中( )、一般( )、差( );

(4)回答问题(20分):

优( )、良( )、中( )、一般( )、差( );

(5)论文撰写(30分):

优( )、良( )、中( )、一般( )、差( );

(6)格式规范性及考勤是否降等级:

是( )、否( )

评阅人:

 职称:

讲师

2016年1月12日

一.设计任务-------------------------------------------------------------------------------1

二.需求分析-------------------------------------------------------------------------------1

三.系统设计-------------------------------------------------------------------------------2

四.编码实现-------------------------------------------------------------------------------6

五.调试分析-------------------------------------------------------------------------------10

六.课设总结-------------------------------------------------------------------------------15

七.谢辞-------------------------------------------------------------------------------------15

八.参考文献--------------------------------------------------------------------------------15

 

一、设计任务

通讯录管理系统的设计与实现——哈希表

任务:

利用哈希表完成通讯录的一般性管理工作:

(1)添加信息;

(2)显示信息:

可以按照手机或联系人的姓名拼音排序显示;

(3)查找:

用名字和手机号分别作为查找的依据,进行查找;

(4)编辑信息;

(5)删除信息;

(6)保存到文件;

要求:

(1)每条记录至少包括姓名、手机、QQ、电子邮箱、城市、邮编等信息。

(2)界面友好,演示程序以用户和计算机的对话方式进行,可反复操作。

二、需求分析

本问题的关键和难点在于如何解决散列的问题。

由于结点的个数无法的知,并且如果采用线性探测法散列算法,删除结点会引起“信息丢失”的问题。

所以采用链地址法散列算法。

采用拉链法,当出现同义词冲突时,使用链表结构把同义词链接在一起,即同义词的存储地址不是散列表中其他的空地址。

首先,解决的是定义链表结点,在拉链法中,每个结点对应一个链表结点,它由三个域组成,而由于该程序需要分别用电话号码和用户名为关键字建立哈希表,所以该链表结点它是由四个域组成.name[16]、num[11]和address[20]都是char浮点型,输入输出都只能是浮点型的。

采用拉链法,其中的所有同义词构成一个单链表,再由一个表头结点指向这个单链表的第一个结点。

这些表头结点组成一个一维数组,即哈希表。

数组元素的下标对应由散列函数求出的散列地址。

其次,设计散列函数,本程序需要设计两个散列函数才能解决问题,程序需要分别为以电话号码和用户名为关键字建立哈希表。

所以要分别以用户名、号码为关键字建立两个散列函数,

对于以号码为关键字的散列函数,是将十一个数字全部相加,然后对20求余。

得到的数作为地址。

对于以用户名为关键字的散列函数,是将所有字母的ASCLL码值相加,然后对20求余。

再次,需要实现添加结点的功能,则其中必须包括一个输入结点信息、添加结点的函数;

需要实现查找函数,则必须包括一个查找结点的函数;需要对文件进行保存,则必需要包括

保存文件函数。

还需要包括一个主菜单和一个主函数。

三、系统设计

在拉链法中,每个结点对应一个链表结点,它由三个域组成,而由于该程序需要分别用电话号码和用户名为关键字建立哈希表,所以该链表结点它是由四个域组成,链地址法结点结构如图:

name[16]num[11]address[20]next

其中name[16]和num[11]是分别为以电话号码和用户名为关键字域,存放关键字;address[20]

为结点的数据域,用来存储用户的地址。

Next指针是用来指向下一个结点的地址。

主要算法的流程图如下:

初始化散列链表

(1)并为其动态分配内存空间

初始化散列链表

(2)并为其动态分配内存空间

Hash:

SASH2:

Apend()

FIND:

首先定义结点结构体类型,在拉链法中,每个结点对应一个链表结点,它由三个域组成,而由于该程序需要分别用电话号码和用户名为关键字建立哈希表,所以该链表结点它是由四个域组成,链地址法结点结构如图:

name[16]num[11]address[20]next

其中name[16]和num[11]是分别为以电话号码和用户名为关键字域,存放关键字;address[20]

为结点的数据域,用来存储用户的地址。

next指针是用来指向下一个结点的地址。

#include用来输入/输出文件流类包含的文件是fstream。

unsignedint

key和unsignedintkey2由于题目要求分别以电话号码和用户名为关键字,所以在此设计两个关键字。

其次,设计两个hash()函数,以电话号码为关键字建立哈希函数hash(charnum[11])。

哈希函数的主旨是将电话号码的十一位数字全部加起来,然后在对20求余。

将计算出来的数作为该结点的地址赋给key。

以用户名为关键字建立哈希函数hash2(charname[8])。

利用强制类型转换,将用户名的每一个字母的ASCLL码值相加并且除以20后的余数。

将计算出来的数作为该结点的地址赋给key2。

再次,建立结点,并添加结点,利用拉链法解决冲突。

建立结点应包括动态申请内存空间。

向结点中输入信息。

同时将结点中的next指针等于null。

添加结点,首先需要利用哈希函数计算出地址即关键字,其次将该结点插入以关键字为地址的链表后,当然由于分别以用户名和电话号码为关键字,所以分两种情况,如果以用户名为关键字则调用voidhash2(charname[8])函数,并且将结点插入对应的散列链表中,如果以电话号码为关键字则调用voidhash(charnum[11])函数,并且将结点插入对应的散列链表中。

并且,需要两个建立散列链表的函数,分别动态申请一定的空间,用于动态申请散列链表。

voidcreate()用来动态创建以电话号码为关键字的链表数组,voidcreate2()用来动态创建以用户名为关键字的链表数组。

同样,需要两个显示链表的函数,利用for循环和while语句将表中信息按要求输出来。

想要实现查找功能,同样需要两个查找函数,无论以用户名还是以电话号码为关键字,首先,都需要利用hash函数来计算出地址。

再依次对比,如果是以电话号码为关键字,比较其电话号码是否相同,如果相同则输出该结点的所有信息,如果以用户名为关键字,则比较用户名是否相同,如果相同则输出该结点的所有信息。

如果找不到与之对应相同的,则输出“无记录”。

同时需要一个保存文件的函数,利用一个for循环,当用hash函数计算的地址,在链表的动态申请的数组范围之内,则创建一个文件流对象,并将结点信息保存在该文件中。

最后,需要创建一个主菜单和一个主函数,主菜单便于用户的使用,主函数中,包括所有功能对应的数值,使之和主菜单相吻合。

四、编码实现

#include

#include

#include

usingnamespacestd;

#defineNULL0

unsignedintkey;//用来输入/输出文件流类

unsignedintkey2;//key和key2分别是用做了电话号码和姓名的关键字

int*p;

structnode//新建节点(用户姓名、地址、qq、邮箱、城市、邮编、电话号码、指向下一个结点的指针)

{

charname[16],address[20],qq[10],email[20],city[20],PC[6];

charnum[11];

node*next;

};

typedefnode*pnode;

typedefnode*mingzi;//声明了名字和电话两个指针

node**phone;

node**nam;

node*a;

voidhash(charnum[11])//以电话号码为关键字建立哈希函数

{

inti=3;

key=(int)num[2];

while(num[i]!

=NULL)

{

key+=(int)num[i];

i++;

}

key=key%20;

}

voidhash2(charname[16])//姓名为关键字建立哈希函数

{

inti=1;

key2=(int)name[0];

while(name[i]!

=NULL)

{

key2+=(int)name[i];

i++;

}

key2=key2%20;

}

//强制类型转换,将用户名的每一个字母的ASCLL码值相加并且除以20后的余数

node*input()//输入节点信息,建立结点,并将结点的next指针指空

{

node*temp;

temp=newnode;

temp->next=NULL;

cout<<"输入姓名:

"<

cin>>temp->name;

cout<<"输入地址:

"<

cin>>temp->address;

cout<<"输入qq:

"<

cin>>temp->qq;

cout<<"输入城市:

"<

cin>>temp->city;

cout<<"输入邮箱:

"<

cin>>temp->email;

cout<<"输入邮编:

"<

cin>>temp->PC;

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[20];//动态创建对象数组,C++课本P188页

for(i=0;i<20;i++)

{

phone[i]=newnode;

phone[i]->next=NULL;

}

}

voidcreate2()//新建节点

{

inti;

nam=newmingzi[20];

for(i=0;i<20;i++)

{

nam[i]=newnode;

nam[i]->next=NULL;

}

}

(此为部分代码)

五、调试分析

1、语法错误及修改:

由于本算法使用了链表结构和拉链法解决冲突的问题,所以程序可以相对来说得到简化,语句相对简洁。

并且冲突得到很好的解决。

所以出现的语法问题主要在于子函数和变量的定义,括号的配对,关键字和函数名称的书写,以及一些库函数的规范使用。

这些问题均可以根据编译器的警告提示,对应的将其解决。

2、逻辑问题修改和调整:

链表结构方法虽然方便了运行,但是增加了对算法过程的认识难度。

在本程序中每一个函数中都需要涉及到指针的操作。

所以需要仔细分析函数中的指针指向。

在插入结点,查找结点时尤为突出。

对于主菜单和主函数的对应,一定要一致,这样才能保证运行时不会出错。

3、时间,空间性能分析:

散列法本质上是一种通过关键字直接计算存储地址的方法。

在理想情况下,散列函数可以把结点均匀地分布到散列表中,不发生冲突,则查找过程无需比较,其时间复杂度O(n)=1。

但在实际使用过程中,为了将范围广泛的关键字映射到一组连续的存储空间,往往会发生同义词冲突,这时在查找过程中就需要进行关键字比较。

因此散列法的查找性能取决于3个因素:

散列函数、冲突处理方法和填充因子。

拉链法可以从根本上杜绝二次聚集,从而提高散列表的均匀度,提高查找性能。

当散列函数和冲突处理办法固定时,散列法的查找性能就取决于散列表的填充因子。

填充因子a=表中已有的结点数/表的长度。

填充因子a标志表的添满程度。

很显然,a越小则发生冲突的机会就越小;反之,a越大冲突的机会就越大,查找的性能也就越低。

哈希表链地址法查找成功的平均查找长度SNc=1+a/2。

链地址法查找不成功的平均查找长度Un满足:

Unc=a+e-a.由以上可以看出,散列表的平均查找长度是填充因子的函数,和散列表的长度没有关系,因此在实际应用中,我们应该选择一个适当的填充因子,以便把平均查找长度控制在一个尽量小的范围内。

六、课设总结

经验和体会:

最初拿到这个问题,因为以前在做C++语言课程设计的时候拿到的也是这个题目,所以很熟悉,但是数据结构课上多用的是C,所以用C++来设计并且参考了以前做的题目,联系了数据结构课本上和题目要求做出了设计。

刚开始想到的是电话号码的存储肯定不是固定的一成不变的,所以需要建立动态链表,并且如果采用线性探测法散列算法解决冲突问题,删除结点会引起“信息丢失”的问题。

因为在线性探测散列法中,我请教了同学,处理冲突的方式是把同义词放到散列表中的下一个空地址,而查找是沿着同一个路径进行的。

因此当删除了一个结点后,由于标志数组被更新,其后的同义词也将不再被查找到。

而采用拉链法,当出现同义词冲突时,使用链表结构把同义词链接在一起,即同义词的存储地址不是散列表中其他的空地址。

因此需要进行详细的分析来发现和解决这些情况。

这也是一个对问题从认识到建立模型,之后提出方法,修改方法,最终解决问题的过程。

七、谢辞

感谢华东交大软件学院与王英华老师给了我课程设计这个平台,让我有了这个磨砺自己与锻炼能力的机会,感谢同学们耐心帮我解决问题。

八、参考文献

⑴严蔚敏李冬梅吴伟民著.数据结构(C语言版)[M].人民邮电出版社.2015.2

⑵李春葆.数据结构教程上机实验指导[M].清华大学出版社.2013.1

⑶何钦铭,冯燕等.数据结构课程设计[M].浙江大学出版社.2007.8

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 视频讲堂

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1