数据结构课程设计报告模板参考.docx

上传人:b****8 文档编号:10796845 上传时间:2023-02-23 格式:DOCX 页数:28 大小:157.19KB
下载 相关 举报
数据结构课程设计报告模板参考.docx_第1页
第1页 / 共28页
数据结构课程设计报告模板参考.docx_第2页
第2页 / 共28页
数据结构课程设计报告模板参考.docx_第3页
第3页 / 共28页
数据结构课程设计报告模板参考.docx_第4页
第4页 / 共28页
数据结构课程设计报告模板参考.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

数据结构课程设计报告模板参考.docx

《数据结构课程设计报告模板参考.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告模板参考.docx(28页珍藏版)》请在冰豆网上搜索。

数据结构课程设计报告模板参考.docx

数据结构课程设计报告模板参考

 

攀枝花学院

数据结构课程设计(论文)

题目:

散列表的设计与实现

学生姓名:

刘攀学号:

************

所在院(系):

数学与计算机学院

专业:

网络工程

班级:

二班

指导教师:

蒋斌职称:

副教授

 

2017年6月28日

攀枝花学院教务处制

 

附件2:

攀枝花学院本科学生课程设计任务书

题 目

散列表的设计与实现

1、课程设计的目的

1)使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。

2)使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。

3)使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。

 

2、课程设计的内容和要求(包括原始数据、技术要求、工作要求等)

【问题描述】

设计散列表实现电话号码查找系统。

【基本要求】

1)设每个记录有下列数据项:

电话号码、用户名、地址;

2)从键盘输入各记录,分别以电话号码和用户名为关键字建立散列表;

3)采用一定的方法解决冲突;

4)查找并显示给定电话号码的记录;

5)查找并显示给定用户名的记录。

【进一步完成内容】

1)系统功能的完善;

2)设计不同的散列函数,比较冲突率;

3)在散列函数确定的前提下,尝试各种不同类型处理冲突的方法,考察平均查找长度的变化。

 

3、主要参考文献

[1]刘大有等,《数据结构》(C语言版),高等教育出版社

[2]严蔚敏等,《数据结构》(C语言版),清华大学出版社

[3]WilliamFord,WilliamTopp,《DataStructurewithC++》清华大学出版社

[4]苏仕华等,数据结构课程设计,机械工业出版社

 

4、课程设计工作进度计划

1)分析题目,查阅相关资料:

1天;

2)算法设计、数据结构设计:

1天

3)编写代码并调试:

1天

4)完成课程设计报告:

2天

 

指导教师(签字)

日期

年月日

教研室意见:

 

年月日

学生(签字):

接受任务时间:

年月日

注:

任务书由指导教师填写。

附件3:

课程设计(论文)指导教师成绩评定表

题目名称

评分项目

分值

得分

评价内涵

工作

表现

20%

01

学习态度

6

遵守各项纪律,工作刻苦努力,具有良好的科学工作态度。

02

科学实践、调研

7

通过实验、试验、查阅文献、深入生产实践等渠道获取与课程设计有关的材料。

03

课题工作量

7

按期圆满完成规定的任务,工作量饱满。

能力

水平

35%

04

综合运用知识的能力

10

能运用所学知识和技能去发现与解决实际问题,能正确处理实验数据,能对课题进行理论分析,得出有价值的结论。

05

应用文献的能力

5

能独立查阅相关文献和从事其他调研;能提出并较好地论述课题的实施方案;有收集、加工各种信息及获取新知识的能力。

06

设计(实验)能力,方案的设计能力

5

能正确设计实验方案,独立进行装置安装、调试、操作等实验工作,数据正确、可靠;研究思路清晰、完整。

07

计算及计算机应用能力

5

具有较强的数据运算与处理能力;能运用计算机进行资料搜集、加工、处理和辅助设计等。

08

对计算或实验结果的分析能力(综合分析能力、技术经济分析能力)

10

具有较强的数据收集、分析、处理、综合的能力。

成果

质量

45%

09

插图(或图纸)质量、篇幅、设计(论文)规范化程度

5

符合本专业相关规范或规定要求;规范化符合本文件第五条要求。

10

设计说明书(论文)质量

30

综述简练完整,有见解;立论正确,论述充分,结论严谨合理;实验正确,分析处理科学。

11

创新

10

对前人工作有改进或突破,或有独特见解。

成绩

指导教师评语

 

指导教师签名:

年 月 日

 

摘要

信息社会的高科技,商品经济化的高效益,使计算机的应用已普及到经济和社会生活的各个领域。

计算机虽然与人类的关系愈来愈密切,还有人由于计算机操作不方便继续用手工劳动。

散列表的设计与实现所涉及到的操作算法都是以链表或顺序表的基本运算作为基础的,此程序通过通讯录实现,包括建立通讯录,添加记录,查询记录,删除记录,显示记录,修改记录。

通过顺序表存储结构实现数据的输入,实现各子程序过程的演示,对异常输入信息报错。

关键字:

新建通讯录,散列表,散列函数,处理冲突

 

1课程设计的目的和意义

《数据结构》主要介绍一些最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。

数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。

 

学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。

通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。

通过此次课程设计主要达到以下目的:

 

(1)了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力; 

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

(3)提高综合运用所学的理论知识和方法独立分析和解决问题的能力; 

(4)训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。

 

(5)锻炼动手操作能力,培养我们的创新思维能力。

从编写代码,到调试程序,再到运行程序,这是设计的最重要环节,它需要我们用逻辑思维将我们所学知识和实际相结合,并在对方案的分析过程中能够有所创新,从而使运行方案更严谨更简洁。

培养好良好的思维,便要将这种思维赋予实践,即动手操作能力。

目前,市场上关于计算机运用、计算机软件和电子类相关专业的人才辈出,但毕业生在走进企业公司政府机构或研究单位之后,感觉到缺乏实际开发设计项目的经验,所以我们在课程设计中能够多训练,提高我们将知识融会贯通的能力 

(6)培养我们严谨治学的态度,以及认清自己学知识、运用知识的能力。

     

不管是编写代码,调试代码,还是运行代码,需要我们严谨的思维和态度去对待,这样才能真正起到此设计的作用。

我们也能够在设计中认识到自己对数据结构这门课程学习的欠缺,对以后我们的学习有着很大的指导和帮助。

 学习课程设计,编写程序,将数据结构和算法相结合,了解到数据结构、算法和程序之间的关系,更学习到数据结构和算法的最佳定位

2需求分析

2.1需求概述

在各个领域,不同的通讯录其功能都是为用户储存信息,查找信息提供方便的有效工具。

一个内容全面、功能先进的通讯录对每个用户来说是一个理想的助手。

现在,我们通过对散列表和基本操作的学习和理解,以及在掌握线性表等基本运算的基础上,实现对线性表操作。

这里我们所做的通讯录则是在数据结构学习之后,利用计算机c程序语言编写的,可以实现数据的新建通讯录,添加记录,查询记录,修改记录,删除记录,显示记录功能的可执行程序。

通过它可以进行对联系对象的姓名、地址、电话号码等的记录与查找。

当然,该程序设计也有不足之处,我们一定会不断地努力去更正完善。

很多涉及通讯录的操作的算法都是以顺序表操作为基础,通过顺序表的建立,初始化,结点添加、查询与删除的演示,方便在学习中更好的理解顺序表结点的添加、查询、删除的过程

2.2需求环境

本课程设计需要的设备为硬件要求和软件配置要求具体要求如下:

①硬件要求:

一台计算机。

②软件配置:

WINDOWS、C/VC++6.0。

2.3功能描述

本次课题是的散列表设计与实现。

主要是通过C++语言和数据结构算法实现,主要有以下功能:

1.每个记录需要有存储的数据:

姓名、电话、地址;

2.从键盘输入各记录,分别以电话号码和用户名为关键字建立散列表;

3.采用一定的方法解决冲突;

4.查找并显示给定电话号码的记录;

5.查找并显示给定用户名的记录。

3整体设计(方案设计)

3.1系统功能设计

定义电话本记录数量(MAXSIZE)、表长(HASHSIZE)、姓名长度(MAX_SIZE)以及结构体typedefstruct的内容,构造两个哈希函数hash1和hash2。

功能示意图:

3.2处理功能设计

增加系统功能如下:

添加用户信息;读取所有用户信息;以姓名建立哈希表;以电话号码建立哈希表;查找并显示给定用户名的记录;查找并显示给定电话号码的记录;清屏以及保存功能;

处理流程示意图:

3.3主要模块

键盘输入各人的信息:

voidgetin();

显示输入的用户信息:

voidShowInformation();

除留余数法构造哈希函数:

intHash1();

构造把字符串转换成整型数哈希函数:

intHash2();

冲突处理函数:

Statuscollision();

以姓名为关键字建表:

voidCreateHash1();

以姓名为关键字查表:

voidSearchHash1();

以电话号码为关键字建表:

voidCreateHash2();

以电话号码为关键字查表:

voidSearchHash2();

输出菜单函数:

intmain()。

3.4算法模块设计

3.4.1哈希算法

输入待查找的值即key,即可查找到其对应的值即可。

intHash1(NAstr){

longn;

intm;

n=fold(str);

m=n%HASHSIZE;

returnm;

}

intHash2(NAstr){

longn;

intm;

n=atoi(str);.

m=n%HASHSIZE;

returnm;

}

3.5二次探测再散列

冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。

沿此序列逐个单元地查找,直到找到给定的关键字,或者碰到一个开放的地址(即该地址单元为空)为止(若要插入,在探查到开放的地址,则可将待插入的新结点存人该地址单元)。

查找时探查到开放的地址则表明表中无待查的关键字,即查找失败。

inti,q;

i=c/2+1;

while(i

if(c%2==0){

c++;

q=(p+i*i)%HASHSIZE;

if(q>=0)returnq;

elsei=c/2+1;

}

else{

q=(p-i*i)%HASHSIZE;

c++;

if(q>=0)returnq;

elsei=c/2+1;}

4程序结构及源代码说明

4.1程序结构说明

4.1.1哈希函数

将用户名折叠处理,折叠处理后的数,用除留余数法构造哈希函数。

建立,代码如下:

intHash1(NAstr){

longn;

intm;

n=fold(str);

m=n%HASHSIZE;

returnm;

}

intHash2(NAstr){

longn;

intm;

n=atoi(str);.

m=n%HASHSIZE;

returnm;

}

4.1.2冲突处理函数

建立冲突处理函数,采用二次探测再散列法解决冲突,代码如下:

tatuscollision(intp,int&c){

inti,q;

i=c/2+1;

while(i

if(c%2==0){

c++;

q=(p+i*i)%HASHSIZE;

if(q>=0)returnq;

elsei=c/2+1;

}

else{

q=(p-i*i)%HASHSIZE;

c++;

if(q>=0)returnq;

elsei=c/2+1;

}

}

returnUNSUCCESS;

}

4.2程序源码及说明

#include

#include

#include

#include

#include

#defineMAXSIZE20//电话薄记录数量

#defineMAX_SIZE20//人名的最大长度

#defineHASHSIZE53//定义表长

#defineSUCCESS1

#defineUNSUCCESS-1

#defineLENsizeof(HashTable)

typedefintStatus;

typedefcharNA[MAX_SIZE];

typedefstruct{//记录

NAname;

NAtel;

NAadd;

}Record;

typedefstruct{//哈希表

Record*elem[HASHSIZE];//数据元素存储基址

intcount;//当前数据元素个数

intsize;//当前容量

}HashTable;

Statuseq(NAx,NAy){//关键字比较,相等返回SUCCESS;否则返回UNSUCCESS

if(strcmp(x,y)==0)

returnSUCCESS;

elsereturnUNSUCCESS;

}

StatusNUM_BER;//记录的个数

voidgetin(Record*a){//键盘输入各人的信息

cout<<"输入要添加的个数:

\n";

cin>>NUM_BER;

inti;

for(i=0;i

cout<<"请输入第"<

\n";

cin>>a[i].name;

cout<<"请输入第"<

\n";

cin>>a[i].tel;

cout<<"请输入第"<

\n";

cin>>a[i].add;//gets(str2);

}

}

voidShowInformation(Record*a)//显示输入的用户信息

{

inti;

for(i=0;i

cout<<"\n第"<

\n姓名:

"<

"<

"<

}

voidCls(Record*a){

cout<<"*";

system("cls");

}

longfold(NAs){//人名的折叠处理

char*p;

longsum=0;

NAss;

strcpy(ss,s);//复制字符串,不改变原字符串的大小写

strupr(ss);//将字符串ss转换为大写形式

p=ss;

while(*p!

='\0')

sum+=*p++;

cout<<"\nsum===================="<

returnsum;

}

intHash1(NAstr){//哈希函数

longn;

intm;

n=fold(str);//先将用户名进行折叠处理

m=n%HASHSIZE;//折叠处理后的数,用除留余数法构造哈希函数

returnm;//并返回模值

}

intHash2(NAstr){//哈希函数

longn;

intm;

n=atoi(str);//把字符串转换成整型数.

m=n%HASHSIZE;//用除留余数法构造哈希函数

returnm;//并返回模值

}

Statuscollision(intp,int&c){//冲突处理函数,采用二次探测再散列法解决冲突

inti,q;

i=c/2+1;

while(i

if(c%2==0){

c++;

q=(p+i*i)%HASHSIZE;

if(q>=0)returnq;

elsei=c/2+1;

}

else{

q=(p-i*i)%HASHSIZE;

c++;

if(q>=0)returnq;

elsei=c/2+1;

}

}

returnUNSUCCESS;

}

voidbenGetTime();

voidCreateHash1(HashTable*H,Record*a){//建表,以人的姓名为关键字,建立相应的散列表benGetTime();

inti,p=-1,c,pp;

for(i=0;i

c=0;

p=Hash1(a[i].name);

pp=p;

while(H->elem[pp]!

=NULL){

pp=collision(p,c);

if(pp<0){

cout<<"第"<

continue;

}//无法解决冲突,跳入下一循环

}

H->elem[pp]=&(a[i]);//求得哈希地址,将信息存入

H->count++;

cout<<"第"<

}

cout<<"\n建表完成!

\n此哈希表容量为"<count<<".\n";

benGetTime();

}

voidSearchHash1(HashTable*H,int&c){//在通讯录里查找姓名关键字,若查找成功,显示信息

benGetTime();

NAstr;

cout<<"\n请输入要查找记录的姓名:

\n";

cin>>str;

intp,pp;

p=Hash1(str);

pp=p;

while((H->elem[pp]!

=NULL)&&(eq(str,H->elem[pp]->name)==-1))

pp=collision(p,c);

if(H->elem[pp]!

=NULL&&eq(str,H->elem[pp]->name)==1){

cout<<"\n查找成功!

\n查找过程冲突次数为"<

\n\n";

cout<<"姓名:

"<elem[pp]->name<<"\n电话号码:

"<elem[pp]->tel<<"\n联系地址:

"<elem[pp]->add<<"\n";

}

elsecout<<"\n此人不存在,查找不成功!

\n";

benGetTime();

}

voidbenGetTime(){

SYSTEMTIMEsys;

GetLocalTime(&sys);

cout<

}

voidCreateHash2(HashTable*H,Record*a){//建表,以电话号码为关键字,

benGetTime();

inti,p=-1,c,pp;

for(i=0;i

c=0;

p=Hash2(a[i].tel);

pp=p;

while(H->elem[pp]!

=NULL){

pp=collision(p,c);

if(pp<0){

cout<<"第"<

continue;

}//无法解决冲突,跳入下一循环

}

H->elem[pp]=&(a[i]);//求得哈希地址,将信息存入

H->count++;

cout<<"第"<

\n";//需要显示冲突次数时输出

}

cout<<"\n建表完成!

\n此哈希表容量为"<count<<".\n";

benGetTime();

}

voidSearchHash2(HashTable*H,int&c){//在通讯录里查找电话号码关键字,若查找成功,显示信息

benGetTime();

NAtele;

cout<<"\n请输入要查找记录的电话号码:

\n";

cin>>tele;

intp,pp;

p=Hash2(tele);

pp=p;

while((H->elem[pp]!

=NULL)&&(eq(tele,H->elem[pp]->tel)==-1))

pp=collision(p,c);

if(H->elem[pp]!

=NULL&&eq(tele,H->elem[pp]->tel)==1){

cout<<"\n查找成功!

\n查找过程冲突次数为"<

\n\n";

cout<<"姓名:

"<elem[pp]->name<<"\n电话号码:

"<elem[pp]->tel<<"\n联系地址:

"<elem[pp]->add<<"\n";

}

elsecout<<"\n此人不存在,查找不成功!

\n";

benGetTime();

}

voidSave(){

FILE*fp;

if((fp=fopen("c:

\test.txt","w"))==NULL){

printf("\nERRORopeningcustometfile");

}

fclose(fp);

}

intmain(intargc,char*argv[]){

intc,flag=1;

HashTable*H;

H=(HashTable*)malloc(LEN);

for(inti=0;i

H->elem[i]=NULL;

H->size=HASHSIZE;

H->count=0;

Recorda[MAXSIZE];

while

(1){

cout<<"\n┏━━━━━━━━━━━━━━━━━━━━━┓";

cout<<"\n┃欢迎使用电话号码查找系统┃";

cout<<"\n┏〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓┓";

cout<<"\n┃★★★★★★★哈希表的设计与实现★★★★★★★┃";

cout<<"\n┃【1】.添加用户信息┃";

cout<<"\n┃【2】.读取所有用户信息┃";

cout<<"\n┃【3】.以姓名建立哈希表(再哈希法解决冲突)┃";

cout<<"\n┃【4

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

当前位置:首页 > 高等教育 > 经济学

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

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