链式简单选择排序课程设计.docx
- 文档编号:28456153
- 上传时间:2023-07-13
- 格式:DOCX
- 页数:14
- 大小:88.29KB
链式简单选择排序课程设计.docx
《链式简单选择排序课程设计.docx》由会员分享,可在线阅读,更多相关《链式简单选择排序课程设计.docx(14页珍藏版)》请在冰豆网上搜索。
链式简单选择排序课程设计
链式简单选择排序课程设计
链式简单选择排序
1设计题目
链式简单选择排序
2问题描述
链式简单选择排序即以单链表为存储结构,实现简单选择排序的功能。
显然,实现该程序就是先要建立一个单链表,利用单链表对数据进行存储、操作。
将输入的整型数据以结点的形式存储在这个建立的单链表中。
然后对单链表中的这些结点的值进行简单选择排序。
该问题中,以带有附加头结点的单链表为存储结构,排序分为从大到小排序和从小到大排序两种方式,我们可以用这两种方法分别实现进行排序,分别得到结果。
3设计
3.1存储结构设计
线性表的链式存储结构的特点是用一组任意的可以是不连续的存储单元存储线性表的数据元素。
它包括两个域:
其中存储数据元素信息的称为数据域;存储直接后继存储位置的域称为指针域。
单链表结构体的定义如下:
Structlink_node//链表节点类的定义
{
intdata;//指针域
link_node*next;//值域,不是float*next;关于链表中的
//指针指向问题
link_node(link_node*ptr=NULL){next=ptr;};
//初始化指针成员的构造函数
link_node(constint&item,link_node*ptr=NULL)
{//初始化指针成员和数据的构造函数
data=item;
next=ptr;
};
};//结构体定义“;”结束
其中,值域data以整型存储了所要排序的关键字值,而指针域next以指针型存储了指向下一个结点的地址。
其中两个构造函数分别用于初始化数据和指针成员。
Link_node是定义的一个全局结构体变量,可以在下面的任何函数中调用。
3.2主要算法设计
本程序中主要用到5个函数,分别是构造函数list()、输入结点数据input(int)、输出数据函数output()、从小到大排列函数SelectSort1()、从大到小排列函数voidSelectSort2()。
构造函数:
list(){first=newlink_node;};//创建附加头结点,first指向该结点
输入节点数据函数:
利用后插法建立链表,算法如下
voidlist:
:
input(intendTag)
//其中DendTag为约定的输入序列结束标括志;利用后插法建立单链表
{
link_node*newnode,*last;
intval;
make_empty();//清空链表
cin>>val;
last=first;
while(val!
=endTag)//last指向表尾
{
newnode=newlink_node(val);
if(newnode==NULL)
{
cerr<<"存储分配失误"< exit (1); }//动态分配失败 last->next=newnode; last=newnode;//last永远指向表尾 cin>>val;//插入到表末端 } last->next=NULL;//可有可无,表收尾 } 函数SelectSort1()和SelectSort2()的基本实现思想是一样的,只是一些细节有所不同。 两者构成了本程序的主体部分,链式简单选择排序的基本思想是: 每一趟排序(例如第i趟,i=0,1,2,…,n-2)在后面n-i个待排序的节点数据中找出最小的元素,作为有序元素排列的第i个元素。 待到第n-2趟做完,待排序元素只剩一个了,就不用再选了。 SelectSort1()//实现从小到大排序,其实现代码见附表实验代码。 SelectSort2()//实现从大到小排序,其实现代码见附表实验代码。 这样,主要算法中的函数,只需在主函数中调用即可实现。 3.3测试用例设计 任意输入几个数据,以0为终止符,例如输入972845,634873,127498,928134,518487,215398,对其进行从大到小的排序,排序后结果应为972845,928134,634873,518487,215398,127498。 再输入若干整数,例如输入98375,69828,76837,10738,63874,90897,对其进行从大到小的排序,排序后结果应为10738,63874,69828,76837,90897,98375。 4调试报告 本实验需要采用支持标准MicrosoftVisualC++2010Express编译器,并采用最基础的Win32控制台程序。 在调试程序时,出现错误提示如下: (1) 1>------已启动生成: 项目: 链式简单选择排序--初级版,配置: DebugWin32------ 1>链排序.cpp 1>c: \users\administrator\documents\visualstudio2010\projects\链式简单选择排序--初级版\链式简单选择排序--初级版\链排序.cpp(11): errorC2236: 意外的“class”“list”,是否忘记了“;”? 1>c: \users\administrator\documents\visualstudio2010\projects\链式简单选择排序--初级版\链式简单选择排序--初级版\链排序.cpp(11): errorC2143: 语法错误: 缺少“;”(在“{”的前面) 1>c: \users\administrator\documents\visualstudio2010\projects\链式简单选择排序--初级版\链式简单选择排序--初级版\链排序.cpp(11): errorC2447: “{”: 缺少函数括题(是否是老式的形式表? ) 1>c: \users\administrator\documents\visualstudio2010\projects\链式简单选择排序--初级版\链式简单选择排序--初级版\链排序.cpp(24): errorC2653: “list”: 不是类或命名空间名称 1>c: \users\administrator\documents\visualstudio2010\projects\链式简单选择排序--初级版\链式简单选择排序--初级版\链排序.cpp(46): errorC2653: “list”: 不是类或命名空间名称 1>c: \users\administrator\documents\visualstudio2010\projects\链式简单选择排序--初级版\链式简单选择排序--初级版\链排序.cpp(55): errorC2653: “list”: 不是类或命名空间名称 1>c: \users\administrator\documents\visualstudio2010\projects\链式简单选择排序--初级版\链式简单选择排序--初级版\链排序.cpp(59): errorC2065: “first”: 未声明的标识符 1>c: \users\administrator\documents\visualstudio2010\projects\链式简单选择排序--初级版\链式简单选择排序--初级版\链排序.cpp(59): errorC2227: “->next”的左边必须指向类结构/联合/泛型类型 1>类型是“unknown-type” 1>c: \users\administrator\documents\visualstudio2010\projects\链式简单选择排序--初级版\链式简单选择排序--初级版\链排序.cpp(79): errorC2653: “list”: 不是类或命名空间名称 1>c: \users\administrator\documents\visualstudio2010\projects\链式简单选择排序--初级版\链式简单选择排序--初级版\链排序.cpp(83): errorC2065: “first”: 未声明的标识符 1>1>c: \users\administrator\documents\visualstudio2010\projects\链式简单选择排序--初级版\链式简单选择排序--初级版\链排序.cpp(83): errorC2227: “->next”的左边必须指向类结构/联合/泛型类型 1>类型是“unknown-type” 1>c: \users\administrator\documents\visualstudio2010\projects\链式简单选择排序--初级版\链式简单选择排序--初级版\链排序.cpp(101): errorC2653: “list”: 不是类或命名空间名称 1>c: \users\administrator\documents\visualstudio2010\projects\链式简单选择排序--初级版\链式简单选择排序--初级版\链排序.cpp(104): errorC2227: “->next”的左边必须指向类结构/联合/泛型类型 1>类型是“unknown-type” 1>c: \users\administrator\d链排序.cpp(104): fatalerrorC1903: 无法从以前的错误中恢复;正在停止编译 ==========生成: 成功0个,失败1个,最新0个,跳过0个========== ==========生成: 成功0个,失败1个,最新0个,跳过0个documents\visualstudio2010\projects\链式简单选择排序--初级版\链式简单选择排序--初级版\========== 原因分析: (1)结构体定义结束之后应用“;”结束。 (2)两节点数据作比较时不应该是if(current2<=current3)if(current2->data>=current3->data)或者if(current2->data<=current3->data)。 因为结点包含两个数据。 5经验和体会 本实验课题的设计中涉及到了数据结构中单链表链表和选择排序两个知识点,通过本次课程设计,我对链表的一些操作: 如带附加头结点的链表的创建,链表数据的输入,节点数据的输出以及简单选择排序有了深刻的理解,通过自己动手写代码,同时加深了对选择排序执行过程的了解。 同时也锻炼了自己的动手写代码的能力。 在实验中遇到了平时只看书认识不到的各种语法错误和编译错误,之前对链表有一些错误的认识,通过不断地调试,对之前的错误观点进行了纠正。 编写程序的能力是逐步锻炼出来的,除了对知识的熟悉程度,还要用耐心去处理程序编写过程中的各种小错大错,这是对一个将要从事计算机编程行业的人的基本要求。 当遇到各种编译或语法错误时,我们必须静下心来,仔细思考问题,理清编程时的思路,确保思路正确,然后反复的调试,直至写出正确的,健壮的计算机程序。 如果自己实在找不出错误原因,我们仍可以找同学一起讨论。 总之,通过课程设计,我认识到我们在平常上课时就应该去了解每种算法解决的问题,去认真学习并尝试编写经典算法,去认真听老师讲的每一个程序,从老师那里去了解他们比较成熟的编程思想,并学以致用。 同时我了解到在平时学习中就应该经常锻炼自己的动手能力,并巩固我们课堂上学习的基础知识,这样才能让自己的计算机编程能力进步的更快。 6附录 6.1源程序清单 #include usingnamespacestd; Structlink_node//链表节点类的定义 { intdata;//值域 link_node*next;//指针域 link_node(link_node*ptr=NULL){next=ptr;}; //初始化指针成员的构造函数 link_node(constint&item,link_node*ptr=NULL) { data=item; next=ptr; };//初始化指针成员和数据的构造函数 };//错误: 结构体定义结束需要用“;”结束 classlist{ public: list(){first=newlink_node;}; voidinput(int);//输入 voidoutput();//输出 voidSelectSort1();//从小到大排列 voidSelectSort2();//从大到小排列 voidmake_empty();//错误2: 只声明未定义该函数 ~list() {make_empty();};//析构函数 private: link_node*first; }; voidlist: : input(intendTag) //其中DendTag为约定的输入序列结束标括志;利用后插法建立单链表 { link_node*newnode,*last; intval; make_empty();//清空链表 cin>>val; last=first; while(val! =endTag){//last指向表尾 newnode=newlink_node(val); if(newnode==NULL) { cerr<<"存储分配失误"< exit (1); }//动态分配失败 last->next=newnode; last=newnode;//last永远指向表尾 cin>>val;//插入到表末端 } last->next=NULL;//可有可无,表收尾 } voidlist: : output() { link_node*current=first->next; while(current! =NULL){//输出停止,即无后续结点 cout< current=current->next; } } voidlist: : SelectSort1()//从小到大的排序 { link_node*current1,*current2,*current3; inttemp; for(current1=first->next;current1->next! =NULL;current1=current1->next) {//current1指向本趟查询的首元素 //current2用于查找最小元素 //current3用于指向已经查询过的数据中的最小元素 current3=current1; for(current2=current1->next;current2->next! =NULL;current2=current2->next) { if(current2->data<=current3->data) current3=current2; } if(current2->data<=current3->data) current3=current2; //与上面for语句结合找出本趟查询最小的元素 if(current1->next! =current3->next){ temp=current1->data; current1->data=current3->data; current3->data=temp; }//将本趟查询的最小元素与本趟查找首元素交换位置 } } voidlist: : SelectSort2() //从大到小排序,原理与从小到大排序相同 { link_node*current1,*current2,*current3; inttemp; for(current1=first->next;current1->next! =NULL;current1=current1->next) { current3=current1; for(current2=current1->next;current2->next! =NULL;current2=current2->next) { if(current2->data>=current3->data) current3=current2; } if(current2->data>=current3->data) current3=current2; if(current1->next! =current3->next){ temp=current1->data; current1->data=current3->data; current3->data=temp; } } } voidlist: : make_empty() { link_node*q; while(first->next! =NULL) { q=first->next; first->next=q->next;//从头结点开始删除 deleteq; } } intmain() { lista;//建立对象 cout<<"向链表括中输入数据(0表示终止字符): \n"; a.input(0);//0为终止符 cout<<"您输入的数据为a: \n"; a.output(); cout<<"\n选单: \n.从小到大排列\n2.从大到小排列\n"; intchoice; cin>>choice; if(choice==1){ a.SelectSort1(); cout<<"\n排序后的数列为(从小到大排序): "< a.output(); cout<<"\n"; } elseif(choice==2){ a.SelectSort2(); cout<<"\n排序后的数列为(从大到小排序): "< a.output(); cout<<"\n"; } else cout<<"输入错误"; return0; } 6.2运行结果 对于链式简单选择排序,其数据比较次数与待排序序列的初始顺序无关,其比较次数总是O(n*n),但元素移动次数则与待排序元素序列有关,最好情况下数据一次也不用移动,最坏情况下元素每一趟都要进行结点数据交换,总的移动次数为3(n-1)。 运行输出结果: 1.从大到小排列 2.从小到大排列 本科生课程设计成绩评定表 班级: 计算机1002班姓名: 曹天天 学号: 0121010340232 序号 评分项目 满分 实得分 1 学习态度认真、遵守纪律 10 2 设计分析合理性 10 3 设计方案正确性、可行性、创造性 20 4 设计结果正确性 40 5 设计报告的规范性 10 6 设计验收 10 总得分/等级 评语: 注: 最终成绩以五级分制记。 优(90-100分)、良(80-89分)、中(70-79分)、 及格(60-69分)、60分以下为不及格 指导教师签名: 2012年 7月 5日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 链式 简单 选择 排序 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)