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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

XX学院
数据结构课程设计(论文)
题目:散列表的设计与实现
学生XX:X攀学号:4
所在院(系):数学与计算机学院
专业:网络工程
班级:二班
指导教师:蒋斌职称:副教授
2017年6 月28 日
XX学院教务处制
附件2:
XX学院本科学生课程设计任务书
注:任务书由指导教师填写。

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

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

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

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

关键字:新建通讯录,散列表,散列函数,处理冲突
目录
摘要V 1课程设计的目的和意义 1 2需求分析 2
2.1需求概述 2
2.2需求环境 2
2.3功能描述 2 3整体设计(方案设计) 3
3.1系统功能设计 3
3.2处理功能设计 3
3.3主要模块 5
3.4算法模块设计 5
3.4.1哈希算法 5
3.5二次探测再散列 6 4程序结构及源代码说明 6
4.1程序结构说明 6
4.1.1哈希函数 6
4.1.2冲突处理函数7
4.2程序源码及说明8 5程序测试及运行结果说明1 6
5.1主菜单运行界面1 6
5.2各项功能测试1 6
5.2.1用户信息录入1 6
5.2.2冲突解决17
5.2.3用户查找17 总结18 参考文献20
1 课程设计的目的和意义
《数据结构》主要介绍一些最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。

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

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

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

通过此次课程设计主要达到以下目的:
(1)了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
(2)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
(3)提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
(4)训练用系统的观点和软件开发一般规X进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。

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

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

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

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

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

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

学习课程设计,编写程序,将数据结构和算法相结合,了解到数据结构、算法和程序之间的关系,更学习到数据结构和算法的最佳定位
2 需求分析
2.1 需求概述
在各个领域,不同的通讯录其功能都是为用户储存信息,查找信息提供方便的有效工具。

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

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

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

通过它可以进行对联系对象的XX、地址、等的记录与查找。

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

很多涉及通讯录的操作的算法都是以顺序表操作为基础,通过顺序表的建立,初始化,结点添加、查询与删除的演示,方便在学习中更好的理解顺序表结点的添加、查询、删除的过程
2.2 需求环境
本课程设计需要的设备为硬件要求和软件配置要求具体要求如下:
①硬件要求:一台计算机。

②软件配置:WINDOWS、C/VC++6.0。

2.3 功能描述
本次课题是的散列表设计与实现。

主要是通过C++语言和数据结构算法实现,主要有以下功能:
1.每个记录需要有存储的数据:、、地址;
2.从键盘输入各记录,分别以和用户名为关键字建立散列表;
3.采用一定的方法解决冲突;
4.查找并显示给定的记录;
5.查找并显示给定用户名的记录。

3 整体设计(方案设计)
3.1系统功能设计
定义本记录数量(MAXSIZE)、表长(HASHSIZE)、XX长度(MAX_SIZE)以及结构体typedef struct的内容,构造两个哈希函数hash1和hash2。

功能示意图:
3.2处理功能设计
增加系统功能如下:添加用户信息;读取所有用户信息;以XX建立哈希表;以建立哈希表;查找并显示给定用户名的记录;查找并显示给定的记录;清屏以及保存功能;
处理流程示意图:
3.3 主要模块
键盘输入各人的信息:void getin();
显示输入的用户信息:void ShowInformation() ;
除留余数法构造哈希函数:int Hash1();
构造把字符串转换成整型数哈希函数:int Hash2();
冲突处理函数:Status collision();
以XX为关键字建表:void CreateHash1();
以XX为关键字查表:void SearchHash1();
以为关键字建表:void CreateHash2();
以为关键字查表:void SearchHash2();
输出菜单函数:int main()。

3.4算法模块设计
3.4.1 哈希算法
输入待查找的值即key,即可查找到其对应的值即可。

int Hash1(NA str){
long n;
int m;
n=fold(str);
m=n%HASHSIZE;
return m;
}
int Hash2(NA str){
long n;
int m;
n = atoi(str);.
m=n%HASHSIZE;
return m;
}
3.5 二次探测再散列
冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。

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

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

int i,q;
i=c/2+1;
while(i<HASHSIZE){
if(c%2==0){
c++;
q=(p+i*i)%HASHSIZE;
if(q>=0) return q;
else i=c/2+1;
}
else{
q=(p-i*i)%HASHSIZE;
c++;
if(q>=0) return q;
else i=c/2+1;}
4 程序结构及源代码说明
4.1程序结构说明
4.1.1 哈希函数
将用户名折叠处理,折叠处理后的数,用除留余数法构造哈希函数。

建立,代码如下:
int Hash1(NA str){
long n;
int m;
n=fold(str);
m=n%HASHSIZE;
return m;
}
int Hash2(NA str){
long n;
int m;
n = atoi(str);.
m=n%HASHSIZE;
return m;
}
4.1.2 冲突处理函数
建立冲突处理函数,采用二次探测再散列法解决冲突,代码如下:tatus collision(int p,int &c){
int i,q;
i=c/2+1;
while(i<HASHSIZE){
if(c%2==0){
c++;
q=(p+i*i)%HASHSIZE;
if(q>=0) return q;
else i=c/2+1;
}
else{
q=(p-i*i)%HASHSIZE;
c++;
if(q>=0) return q;
else i=c/2+1;
}
}
return UNSUCCESS;
}
4.2程序源码及说明
#include<stdio.h>
#include<iostream.h>
#include<stdlib.h>
#include<string>
#include <windows.h>
#define MAXSIZE 20 //薄记录数量
#define MAX_SIZE 20 //人名的最大长度
#define HASHSIZE 53 //定义表长
#define SUCCESS 1
#define UNSUCCESS -1
#define LEN sizeof(HashTable)
typedef int Status;
typedef char NA[MAX_SIZE];
typedef struct{//记录
NA name;
NA tel;
NA add;
}Record;
typedef struct{//哈希表
Record *elem[HASHSIZE]; //数据元素存储基址
int count; //当前数据元素个数
int size; //当前容量
}HashTable;
Status eq(NA x,NA y){//关键字比较,相等返回SUCCESS;否则返回UNSUCCESS if(strcmp(x,y)==0)
return SUCCESS;
else return UNSUCCESS;
}
Status NUM_BER; //记录的个数
void getin(Record* a){//键盘输入各人的信息
cout<<"输入要添加的个数:\n";
cin>>NUM_BER;
int i;
for(i=0;i<NUM_BER;i++){
cout<<"请输入第"<<i+1<<"个记录的用户名:\n";
cin>>a[i].name;
cout<<"请输入第"<<i+1<<"个记录的:\n";
cin>>a[i].tel;
cout<<"请输入第"<<i+1<<"个记录的地址:\n";
cin>>a[i].add; //gets(str2);??????
}
}
void ShowInformation(Record* a)//显示输入的用户信息
{
int i;
for( i=0;i<NUM_BER;i++)
cout<<"\n第"<<i+1<<"个用户信息:\n XX:"<<a[i].name<<"\n :"<<a[i].tel<<"\n 联系地址:"<<a[i].add<<"\n";
}
void Cls(Record* a){
cout<<"*";
system("cls");
}
long fold(NA s){//人名的折叠处理
char *p;
long sum=0;
NA ss;
strcpy(ss,s);//复制字符串,不改变原字符串的大小写
strupr(ss);//将字符串ss转换为大写形式
p=ss;
while(*p!='\0')
sum+=*p++;
cout<<"\nsum===================="<<sum;
return sum;
}
int Hash1(NA str){//哈希函数
long n;
int m;
n=fold(str);//先将用户名进行折叠处理
m=n%HASHSIZE; //折叠处理后的数,用除留余数法构造哈希函数return m; //并返回模值
}
int Hash2(NA str){//哈希函数
long n;
int m;
n = atoi(str);//把字符串转换成整型数.
m=n%HASHSIZE; //用除留余数法构造哈希函数
return m; //并返回模值
}
Status collision(int p,int &c){//冲突处理函数,采用二次探测再散列法解决冲突int i,q;
i=c/2+1;
while(i<HASHSIZE){
if(c%2==0){
c++;
q=(p+i*i)%HASHSIZE;
if(q>=0) return q;
else i=c/2+1;
}
else{
q=(p-i*i)%HASHSIZE;
c++;
if(q>=0) return q;
else i=c/2+1;
}
}
return UNSUCCESS;
}
void benGetTime();
void CreateHash1(HashTable* H,Record* a){//建表,以人的XX为关键字,建立相应的散列表benGetTime();
int i,p=-1,c,pp;
for(i=0;i<NUM_BER;i++){
c=0;
p=Hash1(a[i].name);
pp=p;
while(H->elem[pp]!=NULL) {
pp=collision(p,c);
if(pp<0){
cout<<"第"<<i+1<<"记录无法解决冲突";//需要显示冲突次数时输出
continue;
}//无法解决冲突,跳入下一循环
}
H->elem[pp]=&(a[i]); //求得哈希地址,将信息存入
H->count++;
cout<<"第"<<i+1<<"个记录冲突次数为"<<c<<".\n";//需要显示冲突次数时输出
}
cout<<"\n建表完成!\n此哈希表容量为"<<HASHSIZE<<",当前表内存储的记录个数为"<<H->count<<".\n";
benGetTime();
}
void SearchHash1(HashTable* H,int &c){//在通讯录里查找XX关键字,若查找成功,显示信息
benGetTime();
NA str;
cout<<"\n请输入要查找记录的XX:\n";
cin>>str;
int p,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查找过程冲突次数为"<<c<<".以下是您需要要查找的信息:\n\n";
cout<<"XX:"<<H->elem[pp]->name<<"\n:"<<H->elem[pp]->tel<<"\n联系地址:"<<H->elem[pp]->add<<"\n";
}
else cout<<"\n此人不存在,查找不成功!\n";
benGetTime();
}
void benGetTime(){
SYSTEMTIME sys;
GetLocalTime( &sys );
cout<<sys.wYear<<sys.wMonth<<sys.wDay<<sys.wHour<<sys.wMinute<<sys.wSecond <<sys.wMilliseconds;
}
void CreateHash2(HashTable* H,Record* a){//建表,以为关键字,
benGetTime();
int i,p=-1,c,pp;
for(i=0;i<NUM_BER;i++){
c=0;
p=Hash2(a[i].tel);
pp=p;
while(H->elem[pp]!=NULL) {
pp=collision(p,c);
if(pp<0){
cout<<"第"<<i+1<<"记录无法解决冲突";//需要显示冲突次数时输出
continue;
}//无法解决冲突,跳入下一循环
}
H->elem[pp]=&(a[i]); //求得哈希地址,将信息存入
H->count++;
cout<<"第"<<i+1<<"个记录冲突次数为"<<c<<"。

\n";//需要显示冲突次数时输出
}
cout<<"\n建表完成!\n此哈希表容量为"<<HASHSIZE<<",当前表内存储的记录个数为"<<H->count<<".\n";
benGetTime();
}
void SearchHash2(HashTable* H,int &c){//在通讯录里查找关键字,若查找成功,显示信息
benGetTime();
NA tele;
cout<<"\n请输入要查找记录的:\n";
cin>>tele;
int p,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查找过程冲突次数为"<<c<<".以下是您需要要查找的信息:\n\n";
cout<<"XX:"<<H->elem[pp]->name<<"\n:"<<H->elem[pp]->tel<<"\n联系地址:"<<H->elem[pp]->add<<"\n";
}
else cout<<"\n此人不存在,查找不成功!\n";
benGetTime();
}
void Save(){
FILE *fp;
if((fp=fopen("c:\test.txt", "w"))==NULL){
printf("\nERROR opening customet file");
}
fclose(fp);
}
int main(int argc, char* argv[]){
int c,flag=1;
HashTable *H;
H=(HashTable*)malloc(LEN);
for(int i=0;i<HASHSIZE;i++)
H->elem[i]=NULL;
H->size=HASHSIZE;
H->count=0;
Record a[MAXSIZE];
while (1){
cout<<"\n ┏━━━━━━━━━━━━━━━━━━━━━┓";
cout<<"\n ┃欢迎使用查找系统┃";
cout<<"\n ┏〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓┓";
cout<<"\n ┃★★★★★★★哈希表的设计与实现★★★★★★★┃";
cout<<"\n ┃【1】. 添加用户信息┃";
cout<<"\n ┃【2】. 读取所有用户信息┃";
cout<<"\n ┃【3】. 以XX建立哈希表(再哈希法解决冲突) ┃";
cout<<"\n ┃【4】. 以建立哈希表(再哈希法解决冲突) ┃";
cout<<"\n ┃【5】. 查找并显示给定用户名的记录┃";
cout<<"\n ┃【6】. 查找并显示给定的记录┃";
cout<<"\n ┃【7】. 清屏┃";
cout<<"\n ┃【8】. 保存┃";
cout<<"\n ┃【9】. 退出程序┃";
cout<<"\n ┃温馨提示:┃";
cout<<"\n ┃Ⅰ.进行5操作前请先输出3 ┃";
cout<<"\n ┃Ⅱ.进行6操作前请先输出4 ┃";
cout<<"\n ┗〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓┛";
cout<<"\n";
cout<<"请输入一个任务选项>>>";
cout<<"\n";
int num;
cin>>num;
switch(num){
case 1:
getin(a);
break;
case 2:
ShowInformation(a);
break;
case 3:
CreateHash1(H,a); /* 以XX建立哈希表*/
break;
case 4:
CreateHash2(H,a); /* 以建立哈希表*/
break;
case 5:
c=0;
SearchHash1(H,c);
break;
case 6:
c=0;
SearchHash2(H,c);
break;
case 7:
Cls(a);
break;
case 8:
Save();
break;
case 9:
return 0;
break;
default:
cout<<"你输错了,请重新输入!";
cout<<"\n";
}
}
system("pause");
return 0;
}
5 程序测试及运行结果说明
由需求分析可知,散列表的设计与实现主要查找功能,本程序已调试成功并实现了其功能,其运行结果如下:
5.1 主菜单运行界面
主菜单运行界面如图5.1所示:
图5.1 主菜单运行界面
5.2 各项功能测试
5.2.1用户信息录入
用户信息录入如图5.2:
图5.2用户信息录入5.2.2 冲突解决
冲突解决界面如图5.3:
图5.3 冲突解决5.2.3 用户查找
用户查找界面如图5.4:
图5.4 用户查找
总结
数据结构的课程设计是大学时期第二个专业课的课程设计而数据结构这门课也是本学期的一门专业课经过一个学期对数据结构的学习应该说对这门课只有初步的认识掌握的并不是那么牢固。

不过学期末的课程设计又教会了我该如何简单的去运用数据结构去解决问题。

数据结构的算法和之前学习的c 语言有着一些的区别在设计中不能一味的去用原来的c 语言去实现算法和函数。

设计时可以为程序定义全局变量也可以为程序定义局部变量全局变量可以让程序看起来比较简洁局部变量虽说比较繁琐但是易懂且避免了一些不必要的错误发生。

在本次课程设计中分别用到了指针和引用两种不同的方式来设计程序两者各有利弊但最终选择指针作为最后版本所用到的。

这一次我选择的课程设计题目是散列表的设计和查找可以说经过一个多星期设计不管是通过自己的努力、查资料还是询问别人该如何做都是让我更加熟悉这一模块的内容掌握了哈希表其中的一些用法比如说折叠法除留余数法解决冲突的线性探测再散列和二次探测再散列等一些实用的方法。

当然这一部分不是只有这么一些内容还包括了其他的建立哈希表以及解决冲突的方法虽然教材中介绍的比较简单但依然包含了更多的知识就像整个数据结构一样一本教材是不可能把所有的知识点都讲到只是给我们介绍了一些基础知识一些可能用到相对来说比较简单的方法来解决遇到的问题这些方法知识对于我们现在处的一个阶段就已经很实用不能因为掌握了这一模块或者是这一本
书就认为掌握了数据结构的全部。

在课程设计中我很清楚的认识到了自己的不足而自己最大的不足就是少练对一些算法掌握不熟练构造函数时不知该如何使它来符合要求遇到了一些困难的困扰在查阅资料之后才能略微明白这些错误究竟是什么在自己实践操作下也是彻底明白了函数所要求的以及指针运用的错误。

还有一点不足就是基础知识掌握的不牢固此次课程设计又把哈希表部分内容反反复复的看尤其是哈希表的算法将此部分一点一点弄明白才开始动手设计程序。

而在不断地学习和设计中自己也对数据结构产生了浓厚的兴趣了解了它的实用性和可操作性使得程序设计起来不再是那么复杂和繁琐易懂也是它的一个有点。

数据结构的课程设计的结束也是代表了这个学期的数据结构的结束当然数据结构这门学问依然充满了吸引力让我们去探索这是一个结束同样也是一个开始掌握好了基础才能更进一步学习和研究。

这一次的课程数据也是给了我一个教训一定要把基础掌握住才能练习才能做设计。

数据结构的学习给我其他科目的学习提供了一定帮助杜绝眼高手低边学边练为我接下来几个学期对其他专业课的学习提供了宝贵的经验。

这一次两个星期的课程设计给了我足够的时间来让我掌握该部分的知识并且了解到数据结构奥妙所在给了我以后努力学习数据结构的动力程序的成功设计也给了我一定的自信不再害怕自己设计程序时遇到错误而要勇于面对它程序中的错误是一定会被一些简单实用的方法给解决掉。

程序设计完成并且运行无误自己也是对自己感到满意对自己以后学习其他计算机语言也是打下了自信的基础并有了这一次的经历和所获得的经验也是对以后的学习提供了保障。

参考文献
[1]《数据结构》(C语言版),严蔚敏,清华大学,2003.
[2]《数据结构题集》,严蔚敏,清华大学,2005.
[3]《数据结构》(C语言版),X大有,高等教育,2004.
[4]《Data Structure with C++》,William Ford.William Topp,清华大学,2003.。

相关文档
最新文档