数据结构课程设计-链式简单选择排序.doc_第1页
数据结构课程设计-链式简单选择排序.doc_第2页
数据结构课程设计-链式简单选择排序.doc_第3页
数据结构课程设计-链式简单选择排序.doc_第4页
数据结构课程设计-链式简单选择排序.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

武汉理工大学数据结构课程设计说明书学 号: 课 程 设 计题 目链式简单选择排序学 院计算机科学与技术学院专 业 班 级 姓 名LDSD指导教师耿 枫- 1 -2013年7月2日课程设计任务书学生姓名: LDSD 专业班级: 指导教师: 耿枫 工作单位: 计算机科学与技术学院 题 目:链式简单选择排序 初始条件: 试写一个程序,以单链表作为存储结构,实现简单选择排序。 1、课程设计报告中应有你的算法的时间复杂度分析; 2、测试用例自己设计。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)课程设计报告按学校规定格式用A4纸打印(书写),并应包含如下内容: 1、 问题描述简述题目要解决的问题是什么。2、 设计存储结构设计、主要算法设计(用类C语言或用框图描述)、测试用例设计;3、 调试报告调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分析。4、 经验和体会(包括对算法改进的设想)5、 附源程序清单和运行结果。源程序要加注释。如果题目规定了测试数据,则运行结果要包含这些测试数据和运行输出,6、 设计报告、程序不得相互抄袭和拷贝;若有雷同,则所有雷同者成绩均为0分。时间安排:1、第20周(6月29日至7月3日)完成。2、7月3 日8:00到计算中心检查程序、交课程设计报告、源程序(CD盘)。指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 日目录1课程设计问题描述及开发工具- 4 -1.1 课程设计问题描述- 4 -1.2 开发工具- 4 -2程序设计- 4 -2.1思想描述- 4 -2.2存储结构设计- 6 -2.3 主要算法设计- 6 -2.3.1 链表的创建- 6 -2.3.2随机数据产生函数- 7 -2.3.3链式简单排序- 8 -2.3.4词法分析- 9 -3程序调试过程问题与改正- 9 -4运行结果及说明- 10 -4.1以随机方式创建链表- 10 -4.2 用户自己写入数据- 11 -4.3 比较三组不同输入数据的排序- 11 -5时间复杂度分析- 13 -6经验与体会- 14 -7课程设计源程序- 14 -链式简单选择排序链式简单选择排序主要涉及到数据结构中链表和排序两个知识点,其中,链表的知识又涉及创建、插入、遍历等。为了获得测试用例,还需掌握随机数产生方法以及文本文件读写的相关操作。所以,课程设计是很考验我们综合能力的,通过学习,可以进一步提升我们的软件开发能力。1课程设计问题描述及开发工具1.1 课程设计问题描述试编写一个程序,以单链表作为存储结构,实现对待排序表中的数据的简单选择排序,用多组测试例子对程序进行测试,并输出排序结果。1.2 开发工具本课程设计需要安装有支持标准C/C+的Visual C+编译器(VC6.0或更高版本)的计算机一台。2程序设计2.1思想描述为解决问题,首先要建立一组测试用例,本程序提供两中产生数据的方法,在交互界面下,用户可自行选择。一种是直接通过计算机利用rand()函数产生随机数并写入文件;另一种则是由用户自己向文件中输入数据。其次要建立一个单链表,将该文件中的数据(设置为float类型)逐个存储在建立的单链表中。最后,依次对单链表中的结点数据进行简单选择排序,其中排序分为从大到小排序和从小到大排序两种方式,同样可在交互界面下,由用户自行选择。排序后,输出排序结果和运行时间,为保证结果正确性,还要做对结果进行检查。整个人机交互过程中,为保证用户输入指令的合法性,还要对输入数据进行词法分析。选择排序基本思想是:通过n-i次关键字比较,从n-i+1(i=1,2,.,n-1)个记录中选取关键字最大或最小的记录作为有序序列中第i个记录。以此方法循环下去,直到排序完成。用户自己输入数据到文件void sort(elem *head,int cho)选择排序(有两种方式)void check(elem *head,int cho)对排序结果检查void print(elem *head)遍历链表,输出数据是否void print(elem *head)输出未排序数据输入Cho=1Cho=0?void creat_self(elem *&head)构造链表否是Int cho=0;elem *head=NULL;void rand_data(int n,int w)产生随机数,写入文件输入Cho=1Cho=1?程序总流程图如上所示2.2存储结构设计本课程设计要求使用线性表的链式存储结构来存储待排序的数据,定义一个结点类型,它包括两个域:存储数据元素信息的数据域,存储后继元素地址的指针域。单链表结构体的定义如下:struct elemfloat data;elem *next;值域data以float型存储所要排序的数据,指针域next以指针型存储了指向下一个结点的地址。2.3 主要算法设计本程序中的几个较为核心的算法有:创建链表函数void creat_self(elem *&head),随机数函数void rand_data(int n,int w),简单选择排序void sort(elem *head,int cho),词法分析函数int ana(char a,int i,int j)。现依次用c+语言描述他们的具体算法。2.3.1 链表的创建在文件data.txt中,已经保存了要排序的数据,通过读取文件,可以为每个结点写入数据。创建的这个单链表是带头结点的,在遍历它的时候当注意这点,一般情况下,文件是可以打开的,但如果文件无法打开,则输出提示信息并退出函数。void creat_self(elem *&head)/把文件中的数据读出,并建立一个头指针为head的单链表,保存这些数据int c=0;elem *p2;ifstream fin(data.txt);if(!fin) cout文件打开失败!next;for(int i=0;fin;i+)elem *p=new elem;finp-data;p-next=p1-next;p1-next=p;p2=p1;p1=p;p2-next=NULL; /读入的最后一个数无效,故舍去。fin.close();2.3.2随机数据产生函数该函数用到的是伪随机数rand(),并由参数n和w限制个数和分布范围。其实可以把语句fout rand()%w ;改写成fout float(rand()%w)/33*31 ;这样的形式,获得大致分布在0w范围内的随机小数。void rand_data(int n,int w)/产生n个分布在0w范围内的随机数,并写入文件datatxt中ofstream fout(data.txt);if(!fout) cout文件打开失败!0)for(int i=0;in;i+)foutfloat(rand()%w) ;else if(w0)for(int i=0;in;i+)fout0-float(rand()%abs(w)next,即进入外层循环,直到循环到最后一个结点为止。这里还用到了一个函数clock(),它包含在头文件time.h中,用来计算程序的运行时间,有利于我们更直观地了解程序的效率。函数实现代码如下:void sort(elem *head,int cho)/选择排序算法,参数cho决定排序方式clock_t start,end;float temp;elem *p2; /始终指向待排数据的最大(小)值start=clock();for(elem *p=head-next;p!=NULL;p=p-next)p2=p;for(elem *p1=p-next;p1!=NULL;p1=p1-next)if(p2-datap1-data&cho=0)p2=p1;else if(p2-datadata&cho=1)p2=p1;temp=p2-data; /通过中间变量交换数据,完成一轮排序,筛选出一个最值。p2-data=p-data;p-data=temp;end=clock();cout算法用时为(double)(end-start)/CLOCKS_PER_SEC秒endlendl ;/计算算法执行时间2.3.4词法分析在实际输入过程中,用户可能输入非法字符,所以这里需要对数据进行分析,一旦输入不合法,就要提示用户重新输入,否则,本程序可能会崩溃。a保存输入的字符,i,j是程序允许的指令。基本思想为:获取用户输入的字符串a,把a0和i,j比较,若比较成功,并且a1为0时,返回1,否则,返回0。int ana(char a,int i,int j)/词法分析,检验用户的输入是否合法if(a0=0+i|a0=0+j)&(a1=0)return 1;elsereturn 0;3程序调试过程问题与改正在本课程设计的程序调试过程中,出现错误提示如下: (1)-Configuration: test - Win32 Debug-Compiling.test.cppE:c+安装MyProjects课设test.cpp(17) : error C2628: elem followed by void is illegal (did you forget a ;?)执行 cl.exe 时出错. 分析:原来,在定义完结构体以后,没有在括号外面打上“,”,结构体的定义与函数体的格式有点相似,但是函数体后面不用加“,”,这些都是细节上的东西,不要把二者混淆了。 (2)有一次的调试结果如图所示:分析:可以看出,本来是要由计算机自动产生3个随机数,结果链表保存了4个数,并且第四个数明显是错误的。通过分析文件读写过程,发现最后一次保存到链表的数据实际上是无效的。通过改正creat_self(elem *&head)函数,即删除链表最后一个结点,问题解决。(3)-Configuration: test - Win32 Debug-Compiling.test.cppE:c+安装MyProjects课设test.cpp(113) : error C2065: flag : undeclared identifier执行 cl.exe 时出错。分析:在void check(elem *head,int cho)函数中,定义了一个flag变量,用于标示运行状态,但却提示flag未定义,原来,flag被定义在了while语句中,走出while语句后,就不在其作用域内里。把flag定义在函数开头位置,问题解决。4运行结果及说明4.1以随机方式创建链表输入n为100,分布范围w为200,产生100个随机数,建立一个链表。输出的结果如下:4.2 用户自己写入数据用户把数据手动输入到文件data.txt中。4.3 比较三组不同输入数据的排序(1)3000个数据从小到大排序结果如下:(2)500个数据从小到大的排序结果:(3)2000个数据从大到小排序结果如下:4.4结果分析(1)这里使用的数据也可以是小数,负数,但字符等是不允许的。(2)在void creat(elem *&head) 函数中,head必须是一个指针的引用,否则,通过函数建立的链表头指针无法传递。(3)用例一是产生3000个分布在04444间的随机数,并按照从小到大的顺序排序,可以看到,用时为0.047秒,排序后的数据经过check(elem *head)函数的检查,结果正确。用例二是对500组负数排序,因为数据较少,故用时极短,系统显示的用时为0秒。用例三是对2000组分布在06666范围的数据排序,用时0.031秒。对同样一组数据而言,排序的时间可能不同,但差距都很小。5时间复杂度分析 链式简单选择排序void sort(elem *head,int cho)时间复杂度为o(n*n);随机数产生函数void rand_data(int n,int w),创建函数,检查函数void check(elem *head,int cho),打印函数void print(elem *head)时间复杂度均为o(n)。6经验与体会省略7课程设计源程序 /*链式简单选择排序程序武汉理工大学LDSD 2013年7月2日*/#include #include#include#includeusing namespace std;struct elemfloat data;elem *next;void rand_data(int n,int w)/产生n个分布在0w范围内的随机数,并写入文件datatxt中ofstream fout(data.txt);if(!fout) cout文件打开失败!0)for(int i=0;in;i+)foutfloat(rand()%w) ;else if(w0)for(int i=0;in;i+)fout0-float(rand()%abs(w) ;fout.close();int ana(char a,int i,int j)/词法分析,检验用户的输入是否合法if(a0=0+i|a0=0+j)&(a1=0)return 1;elsereturn 0;void creat_self(elem *&head)/把文件中的数据读出,并建立一个头指针为head的单链表,保存这些数据int c=0;elem *p2;ifstream fin(data.txt);if(!fin) cout文件打开失败!next;for(int i=0;fin;i+)elem *p=new elem;finp-data;p-next=p1-next;p1-next=p;p2=p1;p1=p;p2-next=NULL; /读入的最后一个数无效,故舍去。fin.close();void print(elem *head)/遍历链表,在屏幕上显示每个结点中的数据head=head-next;while(head!=NULL)coutdatanext;void sort(elem *head,int cho)/选择排序算法,参数cho决定排序方式clock_t start,end;float temp;elem *p2; /始终指向待排数据的最大(小)值start=clock();for(elem *p=head-next;p!=NULL;p=p-next)p2=p;for(elem *p1=p-next;p1!=NULL;p1=p1-next)if(p2-datap1-data&cho=0)p2=p1;else if(p2-datadata&cho=1)p2=p1;temp=p2-data; /通过中间变量交换数据,完成一轮排序,筛选出一个最值。p2-data=p-data;p-data=temp;end=clock();cout算法用时为(double)(end-start)/CLOCKS_PER_SEC秒endlnext;if(head)while(head-next!=NULL)if(head-datahead-next-data&cho=0)cout你的排序算法有误,因为发现了顺序错误的地方。datanext-data&cho=1)cout你的排序算法有误,因为发现了顺序错误的地方。next;if(flag)cout经过对排序后的数据分析,你的排序结果正确!endl;void creat(elem *&head) /数据产生方式人机交互模块char cho10,n110;int w,n;docout通过系统产生随机数请选择1,自己写入文件请选择0。cho;while(!ana(cho,1,0);if(cho0=1)cout系统会自动产生浮点数,请输入数据的个数N和分布范围W(数据分布在0-W区间)。nw;if(w=0)cout范围w值不能为0,请重新输入!endl;while(w=0);rand_dat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论