版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 链式简单选择排序1 设计题目 链式简单选择排序2 问题描述 链式简单选择排序即以单链表为存储结构,实现简单选择排序的功能。显然,实现该程序就是先要建立一个单链表,利用单链表对数据进行存储、操作。将输入的整型数据以结点的形式存储在这个建立的单链表中。然后对单链表中的这些结点的值进行简单选择排序。 该问题中,以带有附加头结点的单链表为存储结构,排序分为从大到小排序和从小到大排序两种方式,我们可以用这两种方法分别实现进行排序,分别得到结果。3 设计3.1 存储结构设计 线性表的链式存储结构的特点是用一组任意的可以是不连续的存储单元存储线性表的数据元素。它包括两个域:其中存储数据元素信息的称为数据域
2、;存储直接后继存储位置的域称为指针域。 单链表结构体的定义如下:Struct link_node /链表节点类的定义 int data; /指针域link_node*next; /值域,不是float *next; 关于链表中的 /指针指向问题 link_node(link_node*ptr=NULL)next=ptr; /初始化指针成员的构造函数 link_node(const int &item,link_node*ptr=NULL) /初始化指针成员和数据的构造函数 data=item; next=ptr; ; ; /结构体定义“;”结束其中,值域data以整型存储了所要排序的关
3、键字值,而指针域next以指针型存储了指向下一个结点的地址。其中两个构造函数分别用于初始化数据和指针成员。Link_node是定义的一个全局结构体变量,可以在下面的任何函数中调用。3.2 主要算法设计 本程序中主要用到5个函数,分别是构造函数list()、输入结点数据input(int)、输出数据函数output()、从小到大排列函数SelectSort1()、从大到小排列函数 void SelectSort2()。构造函数: list()first=new link_node; /创建附加头结点,first指向该结点输入节点数据函数: 利用后插法建立链表,算法如下 void list:inp
4、ut(int endTag) /其中DendTag为约定的输入序列结束标括志;利用后插法建立单链表 link_node *newnode,*last; int val; make_empty(); /清空链表 cin>>val; last=first; while (val!=endTag) /last指向表尾 newnode=new link_node(val); if(newnode=NULL) cerr<<"存储分配失误"<<endl; exit(1); /动态分配失败 last->next=newnode; last=new
5、node; /last永远指向表尾 cin>>val; /插入到表末端 last->next=NULL; /可有可无,表收尾函数SelectSort1( )和SelectSort2( )的基本实现思想是一样的,只是一些细节有所不同。两者构成了本程序的主体部分,链式简单选择排序的基本思想是:每一趟排序(例如第i趟,i=0,1,2,n-2)在后面n-i个待排序的节点数据中找出最小的元素,作为有序元素排列的第i个元素。待到第n-2趟做完,待排序元素只剩一个了,就不用再选了。SelectSort1( ) /实现从小到大排序,其实现代码见附表实验代码。SelectSort2( ) /实
6、现从大到小排序,其实现代码见附表实验代码。这样,主要算法中的函数,只需在主函数中调用即可实现。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
7、调试报告 本实验需要采用支持标准Microsoft Visual C+ 2010 Express编译器,并采用最基础的Win32控制台程序。 在调试程序时,出现错误提示如下: (1)1>- 已启动生成:项目: 链式简单选择排序-初级版, 配置: Debug Win32 -1> 链排序.cpp1>c:usersadministratordocumentsvisual studio 2010projects链式简单选择排序-初级版链式简单选择排序-初级版链排序.cpp(11): error C2236: 意外的“class”“list”,是否忘记了“;”?1>c:users
8、administratordocumentsvisual studio 2010projects链式简单选择排序-初级版链式简单选择排序-初级版链排序.cpp(11): error C2143: 语法错误: 缺少“;”(在“”的前面)1>c:usersadministratordocumentsvisual studio 2010projects链式简单选择排序-初级版链式简单选择排序-初级版链排序.cpp(11): error C2447: “”: 缺少函数括题(是否是老式的形式表?)1>c:usersadministratordocumentsvisual studio 201
9、0projects链式简单选择排序-初级版链式简单选择排序-初级版链排序.cpp(24): error C2653: “list”:不是类或命名空间名称1>c:usersadministratordocumentsvisual studio 2010projects链式简单选择排序-初级版链式简单选择排序-初级版链排序.cpp(46): error C2653: “list”:不是类或命名空间名称1>c:usersadministratordocumentsvisual studio 2010projects链式简单选择排序-初级版链式简单选择排序-初级版链排序.cpp(55):
10、error C2653: “list”:不是类或命名空间名称1>c:usersadministratordocumentsvisual studio 2010projects链式简单选择排序-初级版链式简单选择排序-初级版链排序.cpp(59): error C2065: “first”: 未声明的标识符1>c:usersadministratordocumentsvisual studio 2010projects链式简单选择排序-初级版链式简单选择排序-初级版链排序.cpp(59): error C2227: “->next”的左边必须指向类结构/联合/泛型类型1>
11、类型是“unknown-type”1>c:usersadministratordocumentsvisual studio 2010projects链式简单选择排序-初级版链式简单选择排序-初级版链排序.cpp(79): error C2653:“list”:不是类或命名空间名称1>c:usersadministratordocumentsvisual studio 2010projects链式简单选择排序-初级版链式简单选择排序-初级版链排序.cpp(83): error C2065:“first”:未声明的标识符1>1>c:usersadministratordoc
12、umentsvisual studio 2010projects链式简单选择排序-初级版链式简单选择排序-初级版链排序.cpp(83): error C2227: “->next”的左边必须指向类结构/联合/泛型类型1>类型是“unknown-type”1>c:usersadministratordocumentsvisual studio 2010projects链式简单选择排序-初级版链式简单选择排序-初级版链排序.cpp(101): error C2653:“list”:不是类或命名空间名称1>c:usersadministratordocumentsvisual
13、 studio 2010projects链式简单选择排序-初级版链式简单选择排序-初级版链排序.cpp(104): error C2227:“->next”的左边必须指向类结构/联合/泛型类型1> 类型是“unknown-type”1>c:usersadministratord链排序.cpp(104): fatal error C1903:无法从以前的错误中恢复;正在停止编译=生成:成功 0 个,失败 1 个,最新 0 个,跳过 0 个= = 生成:成功 0 个,失败 1 个,最新 0 个,跳过 0 个documentsvisual studio 2010projects链式
14、简单选择排序-初级版链式简单选择排序-初级版= 原因分析: (1)结构体定义结束之后应用“;”结束。 (2)两节点数据作比较时不应该是 if(current2<=current3) if(current2->data>=current3->data)或者if(current2->data<=current3->data)。因为结点包含两个数据。5 经验和体会 本实验课题的设计中涉及到了数据结构中单链表链表和选择排序两个知识点,通过本次课程设计,我对链表的一些操作:如带附加头结点的链表的创建,链表数据的输入,节点数据的输出以及简单选择排序有了深刻的理解,
15、通过自己动手写代码,同时加深了对选择排序执行过程的了解。同时也锻炼了自己的动手写代码的能力。 在实验中遇到了平时只看书认识不到的各种语法错误和编译错误,之前对链表有一些错误的认识,通过不断地调试,对之前的错误观点进行了纠正。编写程序的能力是逐步锻炼出来的,除了对知识的熟悉程度,还要用耐心去处理程序编写过程中的各种小错大错,这是对一个将要从事计算机编程行业的人的基本要求。当遇到各种编译或语法错误时,我们必须静下心来,仔细思考问题,理清编程时的思路,确保思路正确,然后反复的调试,直至写出正确的,健壮的计算机程序。如果自己实在找不出错误原因,我们仍可以找同学一起讨论。 总之,通过课程设计,我认识到我
16、们在平常上课时就应该去了解每种算法解决的问题,去认真学习并尝试编写经典算法,去认真听老师讲的每一个程序,从老师那里去了解他们比较成熟的编程思想,并学以致用。同时我了解到在平时学习中就应该经常锻炼自己的动手能力,并巩固我们课堂上学习的基础知识,这样才能让自己的计算机编程能力进步的更快。6 附录6.1 源程序清单#include<iostream>using namespace std;Struct link_node /链表节点类的定义int data; /值域link_node*next; /指针域 link_node(link_node*ptr=NULL)next=ptr; /初
17、始化指针成员的构造函数link_node(const int &item,link_node*ptr=NULL)data=item; next=ptr; / 初始化指针成员和数据的构造函数; /错误:结构体定义结束需要用“;”结束class listpublic:list()first=new link_node;void input(int); /输入void output(); /输出void SelectSort1(); /从小到大排列void SelectSort2(); /从大到小排列void make_empty(); /错误2:只声明未定义该函数list()make_em
18、pty(); /析构函数 private:link_node *first; void list:input(int endTag) /其中DendTag为约定的输入序列结束标括志;利用后插法建立单链表 link_node *newnode,*last; int val; make_empty(); /清空链表 cin>>val; last=first; while (val!=endTag) /last指向表尾 newnode=new link_node(val); if(newnode=NULL) cerr<<"存储分配失误"<<en
19、dl; exit(1); /动态分配失败 last->next=newnode; last=newnode; /last永远指向表尾 cin>>val; /插入到表末端 last->next=NULL; /可有可无,表收尾void list:output()link_node*current=first->next ;while (current!=NULL) /输出停止,即无后续结点 cout<<current->data<<" " /输出结点储存的值 current=current->next;void
20、list:SelectSort1() /从小到大的排序 link_node*current1,*current2,*current3; int temp; for(current1=first->next;current1->next!=NULL;current1=current1->next) /current1指向本趟查询的首元素 /current2用于查找最小元素 /current3用于指向已经查询过的数据中的最小元素 current3=current1; for(current2=current1->next;current2->next!=NULL;cu
21、rrent2=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;
22、/将本趟查询的最小元素与本趟查找首元素交换位置 void list:SelectSort2() /从大到小排序,原理与从小到大排序相同 link_node*current1,*current2,*current3; int temp; for(current1=first->next;current1->next!=NULL;current1=current1->next) current3=current1; for(current2=current1->next;current2->next!=NULL;current2=current2->next)
23、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; void list: make_empty() link_node *q; while(first->next!=NULL) q=first->next; first->next=q->next; /从头结点开始删除 delete q; int main() list a; /建立对象 cout<<"向链表括中输入数据(0表示终止字符
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年儿童疫苗接种规范试题
- 2026年成品出厂质检试题及答案
- 临床执业医师考试(实践技能)模拟题及答案(安徽省安庆市2026年)
- 2026年江苏省东台市高一数学下册期末考试模拟测试卷加答案
- 2026年广东省开平市高一数学下册期末考试模拟试卷及完整答案【易错题】
- 2026年湖南省洪江市高一数学下册期末考试模拟检测卷及答案(历年真题)
- 欧盟营商环境报告2025
- 广东省梅州市全科医生转岗培训考试(理论考核)题库及答案(2026年)
- 2026年湖南省涟源市高一数学下册期末考试模拟试卷及参考答案【轻巧夺冠】
- 2026年吉林省图们市高一数学下册期末考试模拟试卷附完整答案(必刷)
- 《低温等离子体技术简介》课件
- 餐饮食品安全管理人员知识模拟习题及答案
- 冀教版四年级下册数学计算题每日一练(带答案共15天)
- 装配式二次结构施工方案
- 房地产售后服务及维修保障措施
- 【高分复习笔记】东南大学等四校合编《土力学》(第3版)笔记和课后习题(含考研真题)详解
- 《地方国有企业中层管理者绩效考核体系研究》
- 长沙理工大学城南学院《光纤通信原理》2022-2023学年第一学期期末试卷
- 2024年无人机测绘操控员(高级)技能鉴定理论考试题库资料(含答案)
- DL∕T 2010-2019 高压无功补偿装置继电保护配置及整定技术规范
- 青岛版五年级下册分数的加减法练习200题及答案
评论
0/150
提交评论