当前位置:文档之家› 基于链表的排序和查找算法的设计与实现

基于链表的排序和查找算法的设计与实现

《数据结构》实践任务书学生姓名:专业班级:指导教师:题目: 基于链表的排序与查找要求:(1)熟练掌握基本的数据结构;(2)熟练掌握各种算法;(3)运用高级语言编写质量高、风格好的应用程序。

主要任务:1、系统应具备的功能:(1)建立链表(2)基于链表的排序算法实现(3)基于链表的查找算法实现2、数据结构设计;3、主要算法设计;4、编程及上机实现;5、撰写数据结构实践报告,包括:(1)设计题目;(2)摘要和关键字;(3)正文,包括引言、需求分析、数据结构设计、算法设计、程序实现及测试等;(4)结束语;(5)参考文献。

时间安排:2014年-2015年第1学期第15周-第17周15周星期五 1-4节系统设计,数据结构设计,算法设计16周星期四 5-8节编程并上机调试16周星期五 1-4节编程并上机调试17周星期四 5-8节验收程序,提交数据结构实践报告书指导教师签名:2014年11月基于链表的排序和查找算法的设计与实现摘要:该程序的主要功能是对以链表为存储结构的数值型数据进行查找和排序。

排序和查找是链表中的一个重要应用。

本文对输入的n个整数进行内部排序,使用交换排序来实现。

在本程序中应用链式存储结构,对数据进行了基本的查找和排序。

关键字:存储结构链表排序排序。

1.引言查找是求出一个数据元素在序列中的索引或指针,将其返回,本程序返回的为指针。

排序是将一个数据元素(或记录)的任意序列,重新排列成一按关键字(或排序码)有序的序列,以便于进行数据查询。

2.需求分析本程序是基于链表的排序和查找,所以数据的存储结构为连式存储结构。

文件中记录用节点来表示,其物理位置任意,节点之间用指针相连,链表结构的有点在于排序是无需移动记录,只需修改相应记录的指针即可。

排序本程序选用交换排序。

3.数据结构设计3.1建立单链表3.1.1 链表节点定义:整形元素 data存储数据,节点指针 next指向下一个节点typedef struct Cnode{int data;struct Cnode *next;}Cnode;3.1.2 链表数据的存储:函数insert()在表尾插入数据:void insert(Cnode *p,int e){Cnode *s=new Cnode;s->data=e;s->next =NULL ;p->next =s;}因为insert()函数如代码所示只是在一个指针后面连接一个指针,想要完成一组数据的链式存储,在主函数中还有相应的存储代码:int i,n,f,a[100];//={3,1,7,2,5,6,4};Cnode *h= new Cnode;Cnode *r,*p,*s;h->data=0;h->next =NULL;r=h;cout<<"请输入数据数目:";cin>>n;for(i=0;i<n;i++){cout<<i+1<<": ";cin>>a[i];insert(h,a[i]);h=h->next ;}h=r;h为头指针,将h赋给r,r记录h初始指向地址,在存完数据后,再将r 赋给h。

4 算法设计4.1 排序算法的设计4.1.1 排序的定义设含有n个记录(R)的文件f=(R1,R2······Rn),相应记录关键字(key)的集合k={k1,k2······kn}.若对1,2······n的一种排序:P1P2······Pn(1≤Pi≤n,i≠j时,Pi≠Pj)有:kp1≤kp2≤······≤kpn 递增关系或 kp1≥kp2≥······≥kpn 递减关系则使文件f按key线性有序:(Rp1,Rp2······Rpn)称这种运算为排序(或分类)。

值得提出的是,关系符“≥”“≤”并不一定是数学意义上的“小于或等于”或“大于或等于”,而是一种次序关系。

为了讨论方便,一般取整形数作为记录的key,故“≤”或“≥”可作为通常意义上的符号看待。

2.排序方法截至目前,根据各种排序方法的思路,内排序可归纳为以下5类:(1)插入排序(2)交换排序(3)选择排序(4)归并排序(5)基数排序本程序所选择的排序为(2)交换排序。

4.1.2 排序算法的设计void sort(Cnode *h)//排序{int len=count(h);for(int j=0;j<len;j++){int flag=0; //排序完成与否标志Cnode *p=h,*tem,*cur=h->next ,*nex=cur->next,*pre=h;while(cur->next !=NULL){if(cur->data > nex->data){tem=nex->next;cur->next=tem;nex->next=cur;pre->next=nex;}pre=cur;cur=nex;nex=nex->next ;}}}排序中所要用的计算链表长度count()函数int count(Cnode *p){int i=0;Cnode *r=p;while(r->next!=NULL){r=r->next ;i++;}return i;}4.2数据元素的查找Cnode *find(Cnode *p,int e){Cnode *r;r=p;while(r!=NULL && r->data!=e){r=r->next ;}return r;}4.3 程序主函数void main(){int i,n,f,a[100];Cnode *h= new Cnode;Cnode *r,*p,*s;h->data=0;h->next =NULL;r=h;cout<<"请输入数据数目:";cin>>n;for(i=0;i<n;i++){cout<<i+1<<": ";cin>>a[i];insert(h,a[i]);h=h->next ;}h=r;cout<<"请输要查找的元素:";cin>>f;cout<<"排序前数据顺序:";for(i=0;i<n;i++){h=h->next ;cout<<h->data<<" " ;}cout<<endl;h=r;s=find(h,f);cout<<"要查元素的下一元素的数据:";if(s->next !=NULL)cout<<s->next->data<<endl ;elsecout<<"所查元素在队尾!";sort(h);cout<<"排序后数据顺序:";for(i=0;i<n;i++){ h=h->next ;cout<<h->data<<" " ;}cout<<endl;h=r;s=find(h,f);cout<<"要查元素的下一元素的数据:";if(s->next !=NULL)cout<<s->next->data<<endl ;elsecout<<"所查元素在队尾!";}5.运行结果6.设计体会这次数据结构课程设计,我切身的体会到程序必须满足整体严谨,思路清晰,方法合理三个方面,对于综合性的程序更是如此,编程是一个很烦琐的过程,每一小步都要以整体为出发点稍有不慎即导致整个程序出错。

这几个日日夜夜的奋战终于获得一点的成果。

但是遗憾也是很多的,这次数据结构课程设计为我今后的学习指明了方向。

通过这次数据结构课程设计,我对内部排序和查找这两块的知识有了更深的领会,同时加强了对链式存储结构的认识,对C++语言的运用能力有了质的飞跃。

虽然程序还有很多不足之处,但作为我写的一个综合型程序,我还是觉得受益匪浅。

7.结束语在本程序中,我用链式存储结构,对数据进行了基本的查找和排序。

虽然有许多查找和排序方法没使用到,但还是有不小收获。

对于指针的使用一直是我担心的地方,通过上次的实验报告和这次的课程设计,我对于指针用法有了新的体会。

对于指针的排序也略微掌握了一些。

总之这次课程设计的收获还是不小的。

8.参考文献[1]严蔚敏,吴伟民. 《数据结构(C语言版)》, 清华大学出版社,2004年[2]徐绪松,《数据结构与算法导论》, 电子工业出版社,2005年[3]苏世华.《数据结构与算法解析》, 国防工业出版社,2005年[4]宁正元,王秀丽. 《算法与数据结构》 , 清华大学出版社,2004年[5]高小兵.《数据结构实验教程》 , 清华大学出版社,2005年《数据结构》实践成绩评定表班级:姓名:学号:序号评分项目满分实得分1 学习态度认真、遵守纪律102 设计分析合理性103 设计方案正确性、可行性204 设计结果正确性405 设计报告的规范性106 设计验收10总得分/等级评语:注:最终成绩以五级分制记。

优(90-100分)、良(80-89分)、中(70-79分)、及格(60-69分)、60分以下为不及格指导教师签名:年月日11。

相关主题