链式简单选择排序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目: 链式简单选择排序
初始条件:
理论:学习了《数据结构》课程,掌握了基本的数据结构和常用的算法;
实践:计算机技术系实验室提供计算机及软件开发环境。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1、系统应具备的功能:
(1)用户自己输入数据的个数和数据;
(2)建立链表;
(3)基于链表的排序算法实现。
2、数据结构设计;
3、主要算法设计;
4、编程及上机实现;
5、撰写课程设计报告,包括:
(1)设计题目;
(2)摘要和关键字;
(3)正文,包括引言、需求分析、数据结构设计、算法设计、程序实现及测试、结果分析、设计体会等;
(4)结束语;
(5)参考文献。
时间安排:2007年7月2日-7日(第18周)
7月2日查阅资料
7月3日系统设计,数据结构设计,算法设计
7月4日-5日编程并上机调试
7月6日撰写报告
7月7日验收程序,提交设计报告书。
指导教师签名: 2007年7月2日
系主任(或责任教师)签名: 2007年7月2日
链式简单选择排序
摘要:单链表为存储结构,并在这个基础上实现简单选择排序。一趟简单选择排序的操作为:通过n-1次关键字之间的比较,从n-i+1个记录中选出最小的记录并将这个记录并入
一个新的链表中,在原链表中将这个结点删除。
关键字:单链表,简单选择排序,结点,记录
0. 引言
《数据结构》是计算机科学与技术、软件工程及相关学科的专业基础课,也是软件设计的技术基础。《数据结构》课程的教学要求之一是训练学生进行复杂的程序设计的技能和培养良好程序设计的风格,其重要程度决不亚于理论知识的传授,因此课程设计环节是一个至关重要的环节,是训练学生从事工程科技的基本能力,是培养创新意识和创新能力的极为重要的环节。基本要求如下:
(1) 熟练掌握基本的数据结构;
(2) 熟练掌握各种算法;
(3) 运用高级语言编写质量高、风格好的应用程序。
因此在这个课程设计中我选择的是链式简单选择排序。这个实验的实验要求是利用单链表作为记录(数据)的存储结构,并且在记录好用户输入了数据之后对这组数据进行输出,然后对其进行排序,并且输出排序好的数据。
1.需求分析
(1)在这个实验中的数据的存储结构要求是用单链表,不是用数组,也不是循环链表也不是循环链表。
(2)这组数据的大小(即这组数据的个数)是由用户输入的。
(3)用户输入完数据之后,程序能自动的将这些数据(记录)用单链表存储起来。(4)用户输入完数据之后,程序要输出这些数据,以便用户查看自己是否输入错误。(5)对用户输入的数据要自动进行排序操作。
(6)排序完了之后,程序可以自动的输出排序好的数据。
2.数据结构设计
在这个程序中用的存储结构是单链表,对于单链线性表的声明和定义如下:
#define datatype int
typedef struct Lnode
{ datatype data;//结点的数据域
struct Lnode *next;//结点的指针域
} key,*keylist;
其中的“datatype”为整型,其中的“*next”为指针类型,“*keylist”也是指针类型
3.算法设计
3.1 对于使用的算法的简单的描述
在这个课程设计中,我要做的是用单链表做存储结构,将记录的数据惊醒简单选择排序,在简单选择排序的过程中不需要最小值到底是多少,而需要知道的是它在原链表中的位置i,和其前驱结点的位置。
在这个实验中需要求出位置i,这个函数中,由于在单链表中必需将每个值都比较一次,所以需要用一个变量记下最小值所在的位置就。
另外还需要找到最小值的前驱,这个就只是需要在原链表中,将指向结点的指针向后移动i-1个位置就行了。
在这个课程设计中还需要注意的是函数之间参数的传递,虽然在下面的函数中没有用return语句来返回值,但是由于在C语言中,不能由“&”(在C ++中可以使用)来返回值。所以对于那些算法应当进行适当的改正。否则将不能达到所需要的功能。
3.2 删除结点算法
Status listDelete_b(keylist &L,int i,datatype &e)
{ //在带头结点的单链线性表L中,删除第i个元素,并由e返回其值P<-L;j<-0;
while(p->next&&j { p=p->next; j++; } if(!(p->next)||j>i-1) return ERROR;//删除位置不合理 q=p->next; //删除并释放结点 p->next=q->next; e=q->data; free(q); return OK; } 3.3 加入结点 Status ListInsert_L(keylist &L, int i , datatype e) {//在带头结点的单链线性表L中第i个位置之前插入元素e p=L; j=0; while(p不为空或j小于i-1) //寻找第i-1个结点 { p=p->next; ++j; } if(p为空或j大于i-1) return ERROR; //i小于1或大于表长 s->data=e; s->next=p->next; p->next=s; return OK; } 3.4 简单选择排序算法 void simplesort(keylist L, keylist &q ) { //将带头结点的单链线性表L中的数据进行简单选择排序,并且将排序好的结果用//带头结点q的单链表返回 q->next=Null; r=q; while(p不为空) { i=findmin(L);//在现有的元素中找到最小值在现在的链表中的位置i p=premin(L,i);//找到最小值结点的前驱结点 if(p为空) reurn ERROR;