链式简单选择排序

合集下载

《数据结构》填空作业题(答案)

《数据结构》填空作业题(答案)

《数据结构》填空作业题答案第 1 章绪论(已校对无误)1.数据结构包括数据的逻辑结构、数据的存储结构和数据的运算三方面的内容。

2.程序包括两个内容:数据结构和算法。

3.数据结构的形式定义为:数据结构是一个二元组:Data Structure =( D, S)。

4.数据的逻辑结构在计算机存储器内的表示,称为数据的存储结构。

5.数据的逻辑结构可以分类为线性结构和非线性结构两大类。

6.在图状结构中,每个结点的前驱结点数和后继结点数可以有多个。

7.在树形结构中,数据元素之间存在一对多的关系。

8.数据的物理结构,指数据元素在计算机中的标识(映象),也即存储结构。

9.数据的逻辑结构包括线性结构、树形结构和图形结构 3 种类型,树型结构和有向图结构合称为非线性结构。

10. 顺序存储结构是把逻辑上相邻的结点存储在物理上连续的存储单元里,结点之间的逻辑关系由存储单元位置的邻接关系来体现。

11. 链式存储结构是把逻辑上相邻的结点存储在物理上任意的存储单元里,节点之间的逻辑关系由附加的指针域来体现。

12.数据的存储结构可用 4 种基本的存储方法表示,它们分别是顺序存储、链式存储、索引存储和散列存储。

13. 线性结构反映结点间的逻辑关系是一对一的,非线性结构反映结点间的逻辑关系是一对多或多对多。

14.数据结构在物理上可分为顺序存储结构和链式存储结构。

15. 我们把每种数据结构均视为抽象类型,它不但定义了数据的表示方式,还给出了处理数据的实现方法。

16.数据元素可由若干个数据项组成。

17.算法分析的两个主要方面是时间复杂度和空间复杂度。

18.一个算法的时间复杂度是用该算法所消耗的时间的多少来度量的,一个算法的空间复杂度是用该算法在运行过程中所占用的存储空间的大小来度量的。

19.算法具有如下特点:有穷性、确定性、可行性、输入、输出。

20. 对于某一类特定的问题,算法给出了解决问题的一系列操作,每一操作都有它的确切的定义,并在有穷时间内计算出结果。

数据结构试题及答案

数据结构试题及答案
6.设有向图G中有n个顶点e条有向边,所有的顶点入度数之和为d,则e和d的关系为e=d。
8.8.(1,3,4,2),(1,3,2,4)
三、应用题
1.1.(22,40,45,48,80,78),(40,45,48,80,22,78)
2.2.q->llink=p; q->rlink=p->rlink; p->rlink->llink=q; p->rlink=q;
3.3.2,ASL=91*1+2*2+3*4+4*2)=25/9
int m;
while(i<j){
while (i<j && r[j]>x) j=j-1; if (i<j) {r[i]=r[j];i=i+1;}
while (i<j && r[i]<x) i=i+1; if (i<j) {r[j]=r[i];j=j-1;}
}
r[i]=x;
}
2.设有两个集合A和集合B,要求设计生成集合C=A∩B的算法,其中集合A、B和C用链式存储结构表示。
(A) n,e(B) e,n(C) 2n,e(D) n,2e
8.设某强连通图中有n个顶点,则该强连通图中至少有()条边。
(A) n(n-1)(B) n+1(C) n(D) n(n+1)
9.设有5000个待排序的记录关键字,如果需要用最快的方法选出其中最小的10个记录关键字,则用下列()方法可以达到此目的。
4.4.快速排序的最坏时间复杂度为___________,平均时间复杂度为__________。
5.5.设某棵二叉树中度数为0的结点数为N0,度数为1的结点数为N1,则该二叉树中度数为2的结点数为_________;若采用二叉链表作为该二叉树的存储结构,则该二叉树中共有_______个空指针域。

数据结构试卷带答案

数据结构试卷带答案

数据结构试卷(一)一、选择题(20分)1.组成数据的基本单位是( 1.C )。

(A) 数据项(B) 数据类型(C) 数据元素(D) 数据变量2.设数据结构A=(D,R),其中D={1,2,3,4},R={r},r={<1,2>,<2,3>,<3,4>,<4,1>},则数据结构A是( C )。

(A) 线性结构(B) 树型结构(C) 图型结构(D) 集合3.数组的逻辑结构不同于下列(D)的逻辑结构。

(A) 线性表(B) 栈(C) 队列(D) 树4.二叉树中第i(i≥1)层上的结点数最多有(C)个。

(A) 2i (B) 2i(C) 2i-1(D) 2i-15.设指针变量p指向单链表结点A,则删除结点A的后继结点B需要的操作为(.A )。

(A) p->next=p->next->next (B) p=p->next(C) p=p->next->next (D) p->next=p6.设栈S和队列Q的初始状态为空,元素E1、E2、E3、E4、E5和E6依次通过栈S,一个元素出栈后即进入队列Q,若6个元素出列的顺序为E2、E4、E3、E6、E5和E1,则栈S的容量至少应该是(.C )。

(A) 6 (B) 4 (C) 3 (D) 27.将10阶对称矩阵压缩存储到一维数组A中,则数组A的长度最少为(C )。

(A) 100 (B) 40 (C) 55 (D) 808.设结点A有3个兄弟结点且结点B为结点A的双亲结点,则结点B的度数数为(8.B(A) 3 (B) 4 (C) 5 (D) 19.根据二叉树的定义可知二叉树共有(B)种不同的形态。

(A) 4 (B) 5 (C) 6 (D) 710.设有以下四种排序方法,则(B )的空间复杂度最大。

(A) 冒泡排序(B) 快速排序(C) 堆排序(D) 希尔排序二、填空题(30分)1.设顺序循环队列Q[0:m-1]的队头指针和队尾指针分别为F和R,其中队头指针F指向当前队头元素的前一个位置,队尾指针R指向当前队尾元素所在的位置,则出队列的语句为F =____________;。

数据结构第八章_排序

数据结构第八章_排序

49 38 65 97 76
三趟排序:4 13 27 38 48 49 55 65 76 97
算法描述
#define T 3 int d[]={5,3,1};
例 13 48 97 55 76 4 13 49 27 38 65 49 27 38 65 48 97 55 76 4 j j j
j
j
i
例 初始: 49 38 65 97 76 13 27 48 55 4 取d1=5 49 38 65 97 76 13 27 48 55 4 一趟分组:
一趟排序:13 27 48 55 4 取d2=3 13 27 48 55 4 二趟分组:
49 38 65 97 76 49 38 65 97 76
二趟排序:13 4 48 38 27 49 55 65 97 76 取d3=1 13 27 48 55 4 三趟分组:
初始时令i=s,j=t
首先从j所指位置向前搜索第一个关键字小于x的记录,并和rp
交换 再从i所指位置起向后搜索,找到第一个关键字大于x的记录, 和rp交换 重复上述两步,直至i==j为止 再分别对两个子序列进行快速排序,直到每个子序列只含有 一个记录为止
快速排序演示
算法描述
算法评价

38 49 49 38 65 76 97 13 97 76 97 27 13 30 97 27 97 30 初 始 关 键 字
38 49 65 13 76 27 76 13 30 76 27 76 30 97 第 一 趟
38 49 13 65 27 65 13 30 65 27 65 30
38 13 49
时间复杂度
最好情况(每次总是选到中间值作枢轴)T(n)=O(nlog2n) 最坏情况(每次总是选到最小或最大元素作枢轴)

蜂考数据结构答案

蜂考数据结构答案

蜂考数据结构答案1.什么是数据结构?数据结构是计算机存储、组织数据的方式。

数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。

结构包括逻辑结构和物理结构。

数据的逻辑结构包括4种(1)集合:数据元素之间除了有相同的数据类型再没有其他的关系(2)线性结构:数据元素之间是一对一的关系——线性表、栈、队列(3)树形结构:数据元素之间是一对多的关系(4)图状结构:数据元素之间是多对多的关系。

物理结构包括顺序存储结构和链式存储结构。

2.解释一下顺序存储与链式存储顺序存储结构是用一段连续的存储空间来存储数据元素,可以进行随机访问,访问效率较高。

链式存储结构是用任意的存储空间来存储数据元素,不可以进行随机访问,访问效率较低。

3.头指针和头结点的区别?头指针:是指向第一个节点存储位置的指针,具有标识作用,头指针是链表的必要元素,无论链表是否为空,头指针都存在。

头结点:是放在第一个元素节点之前,便于在第一个元素节点之前进行插入和删除的操作,头结点不是链表的必须元素,可有可无,头结点的数据域也可以不存储任何信息。

4.线性结构的特点(1)集合中必存在唯一的一个"第一个元素";(2)集合中必存在唯一的一个"最后的元素";(3)除最后元素之外,其它数据元素均有唯一的"后继";(4)除第一元素之外,其它数据元素均有唯一的"前驱"。

5.数组和链表的区别?从逻辑结构来看:数组的存储长度是固定的,它不能适应数据动态增减的情况。

链表能够动态分配存储空间以适应数据动态增减的情况,并且易于进行插入和删除操作。

从访问方式来看:数组在内存中是一片连续的存储空间,可以通过数组下标对数组进行随机访问,访问效率较高。

链表是链式存储结构,存储空间不是必须连续的,可以是任意的,访问必须从前往后依次进行,访问效率较数组来说比较低。

如果从第i个位置插入多个元素,对于数组来说每一次插入都需要往后移动元素,每一次的时间复杂度都是O(n),而单链表来说只需要在第一次寻找i的位置时时间复杂度为O(n),其余的插入和删除操作时间复杂度均为O(1),提高了插入和删除的效率。

801计算机专业基础

801计算机专业基础

计算机专业基础》考试大纲注:以下五部分内容只选择两部分进行答题一)、计算机组成原理( 75 分)、考查目标1. 深入理解单处理器计算机系统的组织结构、工作原理、互连结构,具有完整的计算机系统整机的 概念;2. 掌握各部件的组成结构、工作原理、软硬件设计的舍取、以及硬件实现;3. 综合运用计算机组成的基本原理和基本方法,对有关计算机硬件系统中的理论和实际问题进行计 算、分析,并能对一些基本部件进行逻辑设计。

、考试内容1. 总线:总线的组成、分类、特性和性能指标,总线的层次结构,总线定时、传送、仲裁。

2. 内存储器:存储器的基本概念、分类、层次结构,半导体主存储器,高速缓冲存储器( 差错检测。

3. 输入/输出:I/O 编制的方法,编程I/O 、程序中断、DMA 勺原理及控制机制。

4. 运算方法与运算器:计算机中的数制系统,数的表示方法,定点数四则运算方法,浮点数四则运 算方法,定点加减法器设计。

5. 指令系统:指令格式、数据类型、寻址方式、指令类型、指令系统设计与优化。

6. 处理器技术:CPU 的结构、CPU 中的寄存器组织、控制器的结构和工作原理、微程序设计技术。

三、参考书目(二)、数据结构( 75 分) 考查目标1.理解数据结构的基本概念;掌握数据的逻辑结构、存储结构及其差异,以及各种基本操作的实现。

2.掌握基本的数据处理原理和方法,在此基础上能够对算法进行设计与分析。

3.能够选择合适的数据结构和方法进行问题求解。

考查内容一、 线性表(一) 线性表的定义和基本操作(二) 线性表的实现1. 顺序存储结构2. 链式存储结构 题号: 801Cache ),1. 唐朔飞编著 . 计算机组成原理(第二版) . 高等教育出版社, 20082. 白中英主编 .计算机组成原理(第四版) . 科学出版社, 20093. 蒋本珊编著 . 计算机组成原理(第二版) . 清华大学出版社, 20083.线性表的应用二、栈、队列和数组(一)栈和队列的基本概念(二)栈和队列的顺序存储结构(三)栈和队列的链式存储结构(四)栈和队列的应用(五)特殊矩阵的压缩存储三、树与二叉树(一)树的概念(二)二叉树1.二叉树的定义及其主要特征2.二叉树的顺序存储结构和链式存储结构3.二叉树的遍历4.线索二叉树的基本概念和构造5.二叉排序树6.平衡二叉树(三)树、森林1.树的存储结构2.森林与二叉树的转换3.树和森林的遍历(四)树的应用1.等价类问题2.哈夫曼树和哈夫曼编码四、图(一)图的概念(二)图的存储及基本操作1.邻接矩阵法2.邻接表法(三)图的遍历1.深度优先搜索2.广度优先搜索(四)图的基本应用及其复杂度分析1.最小(代价)生成树2.最短路径3.拓扑排序4.关键路径五、查找(一)查找的基本概念(二)顺序查找法(三)折半查找法(四)B- 树(五)散列(Hash)表及其查找(六)查找算法的分析及应用六、内部排序(一)排序的基本概念(二)插入排序1.直接插入排序2.折半插入排序3.希尔(shell)排序(三)交换排序1.冒泡排序2.快速排序(四)选择排序1.简单选择排序2.堆排序(五)归并排序1.二路归并排序(六)基数排序(七)各种内部排序算法的比较(八)内部排序算法的应用参考书从考试大纲看,所要求的知识在一般的大学数据结构教材中都已经包含,所以,选择哪本书并不是重要的事情。

数据结构试题及答案

数据结构试题及答案

数据结构试题及答案数据结构试卷(⼗⼀)⼀、选择题(30分)1.设某⽆向图有n个顶点,则该⽆向图的邻接表中有()个表头结点。

(A) 2n (B) n (C) n/2 (D) n(n-1)2.设⽆向图G中有n个顶点,则该⽆向图的最⼩⽣成树上有()条边。

(A) n (B) n-1 (C) 2n (D) 2n-13.设⼀组初始记录关键字序列为(60,80,55,40,42,85),则以第⼀个关键字45为基准⽽得到的⼀趟快速排序结果是()。

(A) 40,42,60,55,80,85 (B) 42,45,55,60,85,80(C) 42,40,55,60,80,85 (D) 42,40,60,85,55,804.()⼆叉排序树可以得到⼀个从⼩到⼤的有序序列。

(A) 先序遍历(B) 中序遍历(C) 后序遍历(D) 层次遍历5.设按照从上到下、从左到右的顺序从1开始对完全⼆叉树进⾏顺序编号,则编号为i结点的左孩⼦结点的编号为()。

(A) 2i+1 (B) 2i (C) i/2 (D) 2i-16.程序段s=i=0;do {i=i+1; s=s+i;}while(i<=n);的时间复杂度为()。

(A) O(n) (B) O(nlog2n) (C) O(n2) (D) O(n3/2)7.设带有头结点的单向循环链表的头指针变量为head,则其判空条件是()。

(A) head==0 (B) head->next==0(C) head->next==head (D) head!=08.设某棵⼆叉树的⾼度为10,则该⼆叉树上叶⼦结点最多有()。

(A) 20 (B) 256 (C) 512 (D) 10249.设⼀组初始记录关键字序列为(13,18,24,35,47,50,62,83,90,115,134),则利⽤⼆分法查找关键字90需要⽐较的关键字个数为()。

(A) 1 (B) 2 (C) 3 (D) 410.设指针变量top指向当前链式栈的栈顶,则删除栈顶元素的操作序列为()。

链式结构上排序算法的研究

链式结构上排序算法的研究

Ke r s h i a l ; u b e s r a g r h ; n e t n s r lo i m ; h o e S r a g r h ; n lss o lo t ms y wo d :c a n tb e b b l o t l o t m i s r o o t g rt i i a h c o s O l o t m a ay i fag r h t i i
实现 ,必须先定义链表 的结点 ,可定义如下的链式结构 :
tp dfn lmt e / lm y e为 it y ee t e y ; e tp i e p/ e n 型
sr tno e tuc d
, 果 h a 指 结 点 的 nx 成 员 为 e d则 结 束循 环 / 如 ed所 et n, f p h a- nx;p结点 总是 从 链 表 的头 结 点 开 始 = ed > et/ / q p > e t/ = 一 nx; q总 是 指 向”P所 指结 点 ”的下 一 结 点 /
下 :对 于链 表 每 一 个 结 点 可 看 成 是 竖 着 排 列 的 “ 泡 ” 气 ,然 后


p=q; q=q ->ne t x;
e =p; nd
分别 从头结点 向尾节点扫 描 。在扫 描 的过 程 中时刻注 意两个 相邻元 素的顺序 ,保证前 一结点元 素 的数 据域小 于后一 节点
ls. e p o r m mi he e ag rtm son c mp e ,a d an lz e om a eo he e ag rt it.W r g a ng t s lo ih o utr n ay e P r r nc ft s lo i f hms .
(nomao n ier gC l g f a zo i nv r t L nh u7 0 7 ) Ifr t nE gne n ol e nh uCt U iesy, az o 3 0 0 i i e oL y i
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 inttypedef 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<i-1)//寻找第i个结点,并令p指向其前驱{ 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个位置之前插入元素ep=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);//在现有的元素中找到最小值在现在的链表中的位置ip=premin(L,i);//找到最小值结点的前驱结点if(p为空)reurn ERROR;u=p->next; // 将最小值从单链表L中删除结点,并入新链表q中。

p->next=u->next;u->next=r->next;r->next=u;r=u;}}3.5查找最小值算法int findmin(keylist L){//在带头结点的单链表L中找关键字最小的元素的位置,并返回其位置int k=0, i=0;datatype min=30000;keylist p;p=L;while(p不为空)//查找关键字最小的元素在单链表中的位置{ k++;if(p的值小于min){ min=p->data;i=k;}p=p->next;}return i;}3.6创建单链表算法void creatlink(keylist &L,int n){//建立一个带有头结点L的,有n个结点的单链表L->next=Null;r=L;for(i=1;i<=n;i++){ 输入q的值;//输入结点数据q->next=r->next;//将结点并入单链表L中r->next=q;r=q;}}3.7有关技术讨论在这个题目中使用的技术有:创建一个单链线性表,在单链表中找最小值的位置,在单链表中找最小值所在结点的前驱结点的地址,以及在单链表中插入和删除结点。

以下分别对它们进行说明。

3.7.1 创建一个单链线性表:首先,分配头结点;然后,每次都产生一个新的结点,并对这个新结点赋值;最后,将这个结点放在单链表的表尾。

3.7.2 在单链表中找最小值的位置:首先,在这个函数先定义一个datatype型的变量min,并将这个变量赋为最大值,并且用一个变量i来记录最小值的位置,用变量k来进行计数(用来存放当前结点是在原链表中的第几个结点);再次,用min和当前结点的关键字进行比较,如果当前结点的关键字比较小,就将min 的值赋为当前结点的关键字,并且将k的值赋给i。

一直重复这个步骤,知道最后一个结点,这样就能够找到单链表中的最小值了;最后,返回这个最小值所在的位置。

3.7.3 在单链表中找到最小值所在结点的前驱结点:首先,在这个程序中用一个keylist类型的变量“p”来记录结点的地址;再次,将指针“p”从都结点的位置向后移动i-1个位置,就能得到最小值所在结点前驱结点的位置;最后,返回这个位置。

3.7.4 在单链表中插入一个结点在这个课程设计中需要插入的位置始终是在表尾,所以用一个指针始终录表尾所在的位置就可以了。

每次都只需要在表尾插入一个结点,再修改尾的位置即可。

3.7.5 在单链表中删除一个结点首先,利用前面已经叙述的算法,找到最小值所在结点的前驱结点的位置,并下来;其次,使用一个新的keylist类型的指针,并且是它指向最小值所在的结点的地址;最后,让前驱结点的后继指向最小值所在结点的后继,这样就将这个含有最小值的结点从原链表中删除了。

这样做的原因是因为这个最小值所在的结点在从原链表中删除后并没有释放其空间,而是将它并入了新链表的表尾,所以这个结点是仍然存在的。

只是它在排序后的链表中去了。

4. 程序实现4.1 程序中函数的声明int selectminkey(key *head);/*在单链表中找到最小值的位置*/keylist premin(key *h,int j);/*找到最小值所在结点的前驱结点*/keylist createkeys(int n);/*创建有n个结点的带头结点的单链表*/4.2 主要算法代码实现4.2.1 查找最小值算法程序int selectminkey(key *head)/*在单链表中找到最小值的位置*/{ int m;/*用来记录最小值的位置*/int k=0;/*k用来记下当前结点在原链表中是第几个结点*/keylist po,min;/*用来记录最小值*/min=(keylist)malloc(sizeof(key));po=(keylist)malloc(sizeof(key));po=head->next;min->data=30000;if(po==null) return 0;m=1;while(po!=null){ k=k+1;if(po->data<min->data){ min->data=po->data;m=k;}po=po->next;}return m;/*返回最小值的位置*/}4.2.2 找最小值结点前驱结点算法程序keylist premin(key *h,int j)/*找到最小值所在结点的前驱结点*/{ int i;keylist qo;/*记录前驱结点*/qo=(keylist)malloc(sizeof(key));qo=h;for(i=1;i<j;i++){ qo=qo->next;}return qo;/*返回前驱结点*/}4.2.3 创建单链表算法程序keylist createkeys(int n)/*创建有n个结点的带头结点的单链表*/ { keylist head,rear,po;/*定义头结点,尾结点,和中间结点*/ int i;head=(keylist)malloc(sizeof(key));rear=(keylist)malloc(sizeof(key));head->next=null;rear=head;for(i=1;i<=n;i++){ printf("Please input the data %d\n",i);po=(keylist)malloc(sizeof(key));/*生成新结点*/scanf("%d",&(po->data));/*输入新结点的数据*/po->next=rear->next;/*将新结点并入链表*/rear->next=po;rear=po;}return head;}4.2.4 删除结点和加入结点算法程序main(){ int i,j,n;keylist h,p,q,ho,r;printf("\n Please input the number of the datas\n");scanf("%d",&n);h=(keylist)malloc(sizeof(key));r=(keylist)malloc(sizeof(key));p=(keylist)malloc(sizeof(key));q=(keylist)malloc(sizeof(key));ho=(keylist)malloc(sizeof(key));ho->next=null;r=ho;h=createkeys(n);/*调用创建单链表的函数,并得到其头结点*/p=h->next;printf("\n the primary datas is: ");for(i=1;i<=n;i++){ printf("%d ",p->data);p=p->next;}for(i=1;i<=n;i++)/*简单选择排序*/{ j=selectminkey(h);/*调用函数找到最小值的位置*/q=premin(h,j);/*调用函数找到最小值所在结点的前驱结点的地址*/p=q->next;q->next=p->next;p->next=r->next;r->next=p;r=p;}printf("\n the datas after sorting is: ");r=ho->next;while(r!=null)/*输出排序后的数据*/{ printf("%d ",r->data);r=r->next;}}4.3 运行结果4.3.1 计算机输出提示及用户输入数据个数4.3.2 计算机提示及用户输入20个数据4.3.4 输出原始数据4.3.5 输出排序后数据结果分析:这个实验的实验结果完全正确。

相关文档
最新文档