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<data<<"";//输出结点储存的值
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日