例2.2设计一个算法,将x插入到一个有序(从小到大排序)的

合集下载

数据结构(C++版)课后习题答案

数据结构(C++版)课后习题答案
⑷ 数据的存储结构主要有( )和( )两种基本方法,不论哪种存储结构,都要存储两方面的内容:( ) 和( )。 【解答】顺序存储结构,链接存储结构,数据元素,数据元素之间的关系
⑸ 算法具有五个特性,分别是( )、( )、( )、( )、( )。 【解答】有零个或多个输入,有一个或多个输出,有穷性,确定性,可行性
⑵ 假设有如下遗产继承规则:丈夫和妻子可以相互继承遗产;子女可以继承父亲或母亲的遗产;子女间不 能相互继承。则表示该遗产继承关系的最合适的数据结构应该是( )。 A 树 B 图 C 线性表 D 集合
【解答】B 【分析】将丈夫、妻子和子女分别作为数据元素,根据题意画出逻辑结构图。
⑶ 算法指的是( )。 A 对特定问题求解步骤的一种描述,是指令的有限序列。 B 计算机程序 C 解决问题的计算方法 D 数据处理 【解答】A 【分析】计算机程序是对算法的具体实现;简单地说,算法是解决问题的方法;数据处理是通过算法完成 的。所以,只有 A 是算法的准确定义。 ⑷ 下面( )不是算法所必须具备的特性。 A 有穷性 B 确切性 C 高效性 D 可行性 【解答】C 【分析】高效性是好算法应具备的特性。 ⑸ 算法分析的目的是( ),算法分析的两个主要方面是( )。 A 找出数据结构的合理性 B 研究算法中输入和输出的关系 C 分析算法的效率以求改进 D 分析算法的易读性和文档性 E 空间性能和时间性能 F 正确性和简明性 G 可读性和文档性 H 数据复杂性和程序复杂性 【解答】C,E 3. 判断题 ⑴ 算法的时间复杂度都要通过算法中的基本语句的执行次数来确定。 【解答】错。时间复杂度要通过算法中基本语句执行次数的数量级来确定。 ⑵ 每种数据结构都具备三个基本操作:插入、删除和查找。 【解答】错。如数组就没有插入和删除操作。此题注意是每种数据结构。 ⑶ 所谓数据的逻辑结构指的是数据之间的逻辑关系。 【解答】错。是数据之间的逻辑关系的整体。 ⑷ 逻辑结构与数据元素本身的内容和形式无关。 【解答】对。因此逻辑结构是数据组织的主要方面。 ⑸ 基于某种逻辑结构之上的基本操作,其实现是唯一的。 【解答】错。基本操作的实现是基于某种存储结构设计的,因而不是唯一的。 4. 分析以下各程序段,并用大 O 记号表示其执行时间。

数据结构试题及答案

数据结构试题及答案
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的结点数为_________;若采用二叉链表作为该二叉树的存储结构,则该二叉树中共有_______个空指针域。

第二章 线性表

第二章 线性表

(7)已知顺序表L中的元素有序递增,设计算法将元素x插入到L 种,并依旧保持其有序递增;设计一个高效的算法,删除顺序表 中所有值为x的元素,要求空间复杂度为O(1)。(基于顺序表基本 操作的运算) (8)(2010年13分)设将n(n>1)个整数存放到一维数组R中。试 设计一个在时间和空间两方面尽可能有效的算法,将R中保有的 序列循环左移P(0<p< n)个位置,即将R中的数据由(X0 X1 ……Xn-1)变换为(Xp Xp+1 ……Xn-1 X0 X1……Xp-1) 要求: (1)给出算法的基本设计思想。 (2)根据设计思想,采用C或C++或JAVA语言描述算法,关键之处 给出注释。 (3)说明你所设计算法的时间复杂度和空间复杂度
2 3 4 5 6
30 60 20 40
6 -1 3 1
h
10
20Βιβλιοθήκη 304050
60∧
8、例题: (1)链表不具有的特点是( )。 A.可随机访问任一元素 B.插入删除不需要移动元素 C.不必事先估计存储空间 D.所需空间与线性表长度成正比 (2)在具有n个结点的单链表中插入一个新结点并使链表仍然有 序的时间复杂度是( )。 A. O(1) B. O(n) C. O(nlog2n) D. O(n2) (3)对于由n个元素组成的线性表,创建一个有序单链表的时间 复杂度是( )。 A. O(1) B. O(n) C. O(nlog2n) D. O(n2)
(4)设A是一个线性表,采用顺序存储结构。在等概率情况下, 平均插入一个元素需要移动多少个元素?若元素插在ai和ai+1之 间的概率为(n-i)/n(n-1)/2,则平均插入一个元素需要移动多少 个元素? (5)以顺序表作为存储结构,实现线性表的就地逆置;判断回 文;设计一个时间复杂度为O(n)的算法,将顺序表中所有元素循 环左移k位;设计一个时间复杂度为O (n)的算法,将顺序表中所 有元素循环右移k位;(基于逆置操作的运算) (6)将顺序表中的元素调整为左右两部分,左边元素为奇数, 右边元素为偶数,要求算法的时间复杂度为O (n);将顺序表A拆 分为B 和C,其中B中的元素小于0,C中的元素大于0;将有序表A和 有序表B合并为C,合并后C依然是有序的。(基于对顺序表的拆分 和合并操作的运算)

数据结构考试题(二)

数据结构考试题(二)

数据结构试卷(一)一、选择题(30分)1.设一维数组中有n个数组元素,则读取第i个数组元素的平均时间复杂度为()。

(A) O(n)(B) O(nlog2n)(C) O(1)(D) O(n2)2.设一棵二叉树的深度为k,则该二叉树中最多有()个结点。

(A) 2k-1(B) 2k(C) 2k-1(D) 2k-13.设某无向图中有n个顶点e条边,则该无向图中所有顶点的入度之和为()。

(A) n(B) e(C) 2n(D) 2e4.在二叉排序树中插入一个结点的时间复杂度为()。

(A) O(1)(B) O(n)(C) O(log2n)(D) O(n2)5.设某有向图的邻接表中有n个表头结点和m个表结点,则该图中有()条有向边。

(A) n(B) n-1(C) m(D) m-16.设一组初始记录关键字序列为(345,253,674,924,627),则用基数排序需要进行()趟的分配和回收才能使得初始关键字序列变成有序序列。

(A) 3(B) 4(C) 5(D) 87.设用链表作为栈的存储结构则退栈操作()。

(A) 必须判别栈是否为满(B) 必须判别栈是否为空(C) 判别栈元素的类型(D) 对栈不作任何判别8.下列四种排序中()的空间复杂度最大。

(A) 快速排序(B) 冒泡排序(C) 希尔排序(D) 堆9.设某二叉树中度数为0的结点数为N0,度数为1的结点数为N l,度数为2的结点数为N2,则下列等式成立的是()。

(A) N0=N1+1(B) N0=N l+N2(C) N0=N2+1(D) N0=2N1+l10.设有序顺序表中有n个数据元素,则利用二分查找法查找数据元素X的最多比较次数不超过()。

(A) log2n+1(B) log2n-1(C) log2n(D) log2(n+1)二、填空题(42分)1.1.设有n个无序的记录关键字,则直接插入排序的时间复杂度为________,快速排序的平均时间复杂度为_________。

第九章习题

第九章习题

第九章习题9.1以关键码序列(503,087,512,061,908,170,897,275,653,426)为例,手工执行以下排序算法,写出每一趟排序结束时的关键码状态:(1)直接插入排序;(2)希尔排序(增量d[1]=5);(3)快速排序;(4)堆排序;(5)归并排序;(6)基数排序。

9.2 一组关键字码,40,27,28,12,15,50,7,采用快速排序或堆排序,写出每趟排序结果。

9.3不难看出,对长度为n的记录序列进行快速排序时,所需进行的比较次数依赖于这n个元素的初始排列。

n=7时在最好情况下需进行多少次比较?请说明理由。

对n=7给出一个最好情况的初始排列实例。

9.4 假设序列由n个关键字不同的记录构成,要求不经排序而从中选出关键字从大到小顺序的前k(k<n)个记录。

试问如何进行才能使所作的关键字间比较次数达到最小?9.5插入排序中找插入位置的操作可以通过二分查找的方法来实现。

试据此写一个改进后的插入排序算法。

9.6编写一个双向起泡的排序算法,即相邻两遍向相反方向起泡。

9.7 编写算法,对n个关键字取整数值的记录序列进行整理,以使所有关键字为负值的记录排在关键字为非负值的记录之前,要求:采取顺序存储结构,至多使用一个记录的辅助存储空间;算法的时间复杂度O(n);讨论算法中记录的最大移动次数。

9.8试以单链表为存储结构实现简单选择排序的算法9.9假设含n个记录的序列中,其所有关键字为值介于v和w 之间的整数,且其中很多关键字的值是相同的。

则可按如下方法排序:另设数组number[v...w]且令number[i]为统计关键字取整数I 的记录数,之后按number 重排序列以达到有序,编写算法实现上述排序方法,并讨论此方法的优缺点。

9.10 已知两个有序序列(a1, a2 ,..., a m)和(a m+1 , a m+2 ,..., a n),并且其中一个序列的记录个数少于s,且s=?√n?. 试写一个算法,用O(n)时间和O(1)附加空间完成这两个有序序列的归并。

快速排序算法实验报告

快速排序算法实验报告

快速排序算法实验报告快速排序一、问题描述在操作系统中,我们总是希望以最短的时间处理完所有的任务。

但事情总是要一件件地做,任务也要操作系统一件件地处理。

当操作系统处理一件任务时,其他待处理的任务就需要等待。

虽然所有任务的处理时间不能降低,但我们可以安排它们的处理顺序,将耗时少的任务先处理,耗时多的任务后处理,这样就可以使所有任务等待的时间和最小。

只需要将n 件任务按用时去从小到大排序,就可以得到任务依次的处理顺序。

当有 n 件任务同时来临时,每件任务需要用时ni,求让所有任务等待的时间和最小的任务处理顺序。

二、需求分析1. 输入事件件数n,分别随机产生做完n件事所需要的时间;2. 对n件事所需的时间使用快速排序法,进行排序输出。

排序时,要求轴值随机产生。

3. 输入输出格式:输入:第一行是一个整数n,代表任务的件数。

接下来一行,有n个正整数,代表每件任务所用的时间。

输出:输出有n行,每行一个正整数,从第一行到最后一行依次代表着操作系统要处理的任务所用的时间。

按此顺序进行,则使得所有任务等待时间最小。

4. 测试数据:输入 95 3 4 26 1 57 3 输出1 2 3 3 4 5 5 6 7三、概要设计抽象数据类型因为此题不需要存储复杂的信息,故只需一个整型数组就可以了。

算法的基本思想对一个给定的进行快速排序,首先需要选择一个轴值,假设输入的数组中有k个小于轴值的数,于是这些数被放在数组最左边的k个位置上,而大于周知的结点被放在数组右边的n-k个位置上。

k也是轴值的下标。

这样k把数组分成了两个子数组。

分别对两个子数组,进行类似的操作,便能得到正确的排序结果。

程序的流程输入事件件数n-->随机产生做完没个事件所需时间-->对n个时间进行排序-->输出结果快速排序方法:初始状态 72 6 57 88 85 42 l r第一趟循环 72 6 57 88 85 42 l r 第一次交换 6 72 57 88 85 42 l r 第二趟循环 6 72 57 88 85 42 r l 第二次交换 72 6 57 88 85 42 r l反转交换 6 72 57 88 85 42 r l这就是依靠轴值,将数组分成两部分的实例。

数据结构与算法实践作业指导书

数据结构与算法实践作业指导书第一章基本概念与算法效率分析 (2)1.1 算法基本概念 (2)1.2 算法效率评价 (2)1.3 时间复杂度分析 (2)1.4 空间复杂度分析 (3)第二章线性表 (3)2.1 线性表的定义与基本操作 (3)2.2 顺序存储结构 (4)2.3 链式存储结构 (4)2.4 线性表的应用实例 (4)第三章栈与队列 (5)3.1 栈的定义与基本操作 (5)3.2 栈的顺序存储结构 (5)3.3 栈的链式存储结构 (5)3.4 队列的定义与基本操作 (6)第四章树与二叉树 (6)4.1 树的定义与基本操作 (6)4.2 二叉树的定义与性质 (6)4.3 二叉树的遍历算法 (7)4.4 线索二叉树 (7)第五章图 (8)5.1 图的定义与基本概念 (8)5.2 图的存储结构 (8)5.3 图的遍历算法 (8)5.4 最短路径算法 (8)第六章排序算法 (9)6.1 排序算法概述 (9)6.2 冒泡排序 (9)6.3 选择排序 (9)6.4 插入排序 (10)第七章查找算法 (10)7.1 查找算法概述 (10)7.2 顺序查找 (10)7.3 二分查找 (11)7.4 哈希查找 (11)第八章动态规划 (12)8.1 动态规划概述 (12)8.2 最长公共子序列 (12)8.3 最小路径和 (12)8.4 最大子段和 (12)第九章贪心算法 (12)9.1 贪心算法概述 (12)9.2 活动选择问题 (13)9.3 背包问题 (13)9.4 最小树问题 (13)第十章分治算法 (13)10.1 分治算法概述 (13)10.2 快速排序 (13)10.2.1 快速排序算法描述 (14)10.2.2 快速排序算法实现 (14)10.3 归并排序 (14)10.3.1 归并排序算法描述 (14)10.3.2 归并排序算法实现 (14)10.4 最大子数组和问题 (15)10.4.1 分治算法求解最大子数组和问题 (15)10.4.2 最大子数组和问题的分治算法实现 (15)第一章基本概念与算法效率分析1.1 算法基本概念算法是计算机科学中一个核心概念,指的是解决问题的一系列明确且有效的步骤。

《数据结构》排序》PPT课件.ppt


结束
结束
[50 65] 76 [97]
50 [65]
结束
结束
[13 38 38 49 50 65 76 97]
(b) 快速排序的全过程
图9.4 快速排序示例
算法9.4 快速排序算法。
void Quick_Sort(NODE array[],int start,int end)
/* 对从array[start]到array[end]的记录快速排序 */
}
}
9.1.2 希尔排序
希尔排序是一种步长递减的插入排序,又称为
“缩小增量排序”。该排序方法是,将直接插入分成插入 步长由大到小不同的若干趟来进行。初始,步长较大,相 当于把待排记录序列分成若干子序列,各子序列中记录的 间隔为步长距离,由于子序列的长度小,所以子序列的插 入排序的效率较高。以后各趟逐步减小步长,随着步长的 减小,子序列的长度在增加,但子序列中包含了上一趟经 过大的步长插入排序的结点,因此,已有部分结点有序, 这样,在排序中记录移动的次数就少,排序的效率也就高。 最后一趟是步长为1,即:对整个序列直接插入排序,但 这时整个序列已基本有序,只要做少量记录移动,就可将 该序列排成有序。
问题,但它的排序速度要比直接插 入排序快,另外,它是一种不稳定 排序
9.2 交换排序
交换排序基本思想:比较二个待排序记录的关键字, 若为逆序,则交换位置,反之,保持原序。
9.2.1 冒泡(简单交换排序)
冒泡排序的方法是:首先比较array[n-1].key和array[n-2]. key,若为逆序则交换之,然后比较array[n-2].key和array[n3].key,依此类推,直到比较array[1].key和array[0].key,称为 一趟“冒泡”,其结果是将具有最小关键字的记录排到序列 的第1个位置上。然后再array[n-1]到array[1]之间进行一趟“ 冒泡”,将具有次小关键字的记录排到序列的第2个位置上。 依此类推,直到第n-1趟,在array[n-1]和array[n-2]之间进行“ 冒泡”后,待排序序列已排成有序。

数据结构(C语言版)复习题

一、单项选择题:1、树形结构不具备这样的特点:()A. 每个节点可能有多个后继(子节点)B. 每个节点可能有多个前驱(父节点)C. 可能有多个内节点(非终端结点)D. 可能有多个叶子节点(终端节点)2、二叉树与度数为2的树相同之处包括()。

A. 每个节点都有1个或2个子节点B. 至少有一个根节点C. 至少有一个度数为2的节点D. 每个节点至多只有一个父节点3、一棵完全二叉树有999 个结点,它的深度为()。

A.9 B.10 C.11 D.124、在一个单链表中,若p所指结点不是最后结点,在p之后插入s所指结点,则执行()A. s->next=p;p->next=s;B. s->next=p->next;p->next=s;C. s->next=p->next;p=s;D. p->next=s;s->next=p;5、对于一棵具有n个结点、度为5的树来说,()A. 树的高度至多是n-3B. 树的高度至多是n-4C. 树的高度至多是nD. 树的高度至多是n-56、在顺序队列中,元素的排列顺序()。

A. 由元素插入队列的先后顺序决定B. 与元素值的大小有关C. 与队首指针和队尾指针的取值有关D. 与数组大小有关7、串是一种特殊的线性表,其特殊性体现在()。

A.可以顺序存储 B.数据元素是一个字符C.可以链式存储 D.数据元素可以是多个字符若8、顺序循环队列中(数组的大小为 6),队头指示 front 和队尾指示 rear 的值分别为 3和 0,当从队列中删除1个元素,再插入2 个元素后,front和 rear的值分别为()。

A.5 和1 B.2和4 C.1和5 D.4 和29、一棵完全二叉树上有1001 个结点,其中叶子结点的个数为()。

A.250 B.500 C.254 D.50110、已知一个有向图如下图所示,则从顶点a出发进行深度优先遍历,不可能得到的DFS序列为()。

排序算法分析和比较

一、设计思想排序是数据处理中使用频率很高的一种操作,是数据查询之前需要进行的一项基础操作。

它是将任意序列的数据元素(或记录)按关键字有序(升序或降序)重新排列的过程。

排序的过程中有两种基本操作:一是比较两个关键字的值;二是根据比较结果移动记录位置。

排序的算法有很多种,这里仅对插入排序、选择排序、希尔排序、归并排序和快速排序作了比较。

直接插入排序算法基本思路:直接插入排序时将一个元素插入已排好的有序数组中,从而得到一个元素个数增加1的新的有序数组。

其具体实现过程是,将第i个元素与已经排好序的i-1个元素依次进行比较,再将所有大于第i个元素的元素后移一个位置,直到遇到小于或等于第i个元素,此时该元素的后面一个位置为空,将i元素插入此空位即可。

选择排序算法基本思路:定义两个数组sela[]和temp[],sela[]用来存放待排序数组,temp[]用来存放排好序的数组。

第一趟,将sela[]数组中n个元素进行比较,找出其中最小的元素放入temp[]的第一个位置,同时将sela[]中将该元素位置设置为无穷大。

第二趟,将sela[]数组中n个元素进行比较,找出其中最小的元素放入temp[]的第二个位置,同时将sela[]中将该元素位置设置为无穷大。

以此类推,n趟后将sela[]中所有元素都已排好序放入temp[]数组中。

希尔排序算法基本思路:希尔排序又称为变长步径排序,它也是一种基于插入排序的思想。

其基本思路是,定义一个步长数组gaps[1,5,13,43……],先选取合适的大步长gap将整个待排序的元素按步长gap分成若干子序列,第一个子序列的元素为a[0]、a[0+gap]、a[0+2gap]……a[0+k*gap];第二列为a[1]、a[1+gap]、a[1+2gap]……a[1+k*gap];……。

然后,对这些子序列分别进行插入排序,然后将gap按gaps[]数组中的步长缩小,按缩小后的步长再进行子序列划分排序,再减小步长直到步长为1为止。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

例2.4 已知长度为n的线性表A采用顺序存储结 构,编写一个时间复杂度为O(n)、空间复杂度为O(1) 的算法,该算法删除线性表中所有值为item的数据元 素。 解 : 用 k 记录顺序表 A 中等于 item 的元素个数 , 边 扫描A边统计k,并将不为item的元素前移k个位臵,最 后修改A的长度。对应的算法如下:
}
void delnode2(SqList &A,ElemType item) { int k=0,i=0; /*k记录值等于item的元素个数*/ while (i<A.length) { if (A.data[i]==item) k++; 算法2
else A.data[i-k]=A.data[i]; /*当前元素前移k个位臵*/
SqList *merge(SqList *p, SqList *q) { SqList *r; int i=0,j=0,k=0; r=(SqList *)malloc(sizeof(SqList)); while (i<p->length && j<q->length) { if (p->data[i]<q-> data[j]) { r-> data[k]=p-> data[i]; i++;k++; } else { r-> data[k]=q-> data[j]; j++;k++; } }
i++;
for (j=L->length-1;j>=i;j--) L->data[j+1]=L->data[j]; L->data[i]=x; L->length++; }
a0
逻辑位序 1
查找插入位置
元素后移一个位置

ai-1
i
ai
i+1

an-1
n


MaxSize
例 2.3 设计一个算法 ,将两个元素有序 (从 小到大)的顺序表合并成一个有序顺序表。 求解思路:将两个顺序表进行二路归并。
答:可以简单地推算,得容易得出D,A,B,C是 不可能的,因为D先出来,说明A,B,C,D均在栈中, 按照入栈顺序,在栈中顺序应为D,C,B,A,出栈的 顺序只能是D,C,B,A。所以本题答案为D。
例 3.3 已知一个栈的进栈序列是 1,2,3,…,n, 其输出 序列是p1,p2,…,pn,若p1=n,则pi的值 。 (A) i (B) n-i
本算法实际上是采用尾插法建立两个新表。 所以,尾插法建表算法是很多类似习题的基础!
例2.6 有一个带头结点的单链表head,其ElemType 类型为char,设计一个算法使其元素递增有序。
解:若原单链表中有一个或以上的数据结点 ,先构 造只含一个数据结点的有序表 (只含一个数据结点的 单链表一定是有序表 ) 。扫描原单链表余下的结点 *p( 直到 p==NULL 为止 ), 在有序表中通过比较找插入 *p 的前驱结点 *q, 然后将 *p 插入到 *q 之后 ( 这里实际 上采用的是直接插入排序方法)。
例3.1 设有4个元素a、b、c、d进栈,给出它 们所有可能的出栈次序。 答:所有可能的出栈次序如下: abcd abdc acbd acdb adcb bacd badc bcad bcda bdca cbad cbda cdba dcba
例 3.2 设一个栈的输入序列为 A,B,C,D, 则借助 一个栈所得到的输出序列不可能是 。 (A) A,B,C,D (C) A,C,D,B (B) D,C,B,A (D) D,A,B,C
while (i<p->length) { r->data[k]=p->data[i]; i++;k++; } while (j<q->length) { r->data[k]=q->data[j]; j++;k++; } r->length=k; /*或p->length+q->length*/ return(r); }
}
例2.7 编写出判断带头结点的双向循环链表L是 否对称相等的算法。 解 :p 从左向右扫描 L,q从右向左扫描 L,若对应数 据结点的 data 域不相等 ,则退出循环 ,否则继续比较 , 直到 p与 q相等或 p的下一个结点为 *q为止。对应算 法如下:
int Equeal(DLinkList *L) { int same=1; DLinkList *p=L->next; /*p指向第一个数据结点*/ DLinkList *q=L->prior; /*q指向最后数据结点*/ while (same==1) if (p->data!=q->data) same=0; else { if (p==q) break; /*数据结点为奇数的情况*/ q=q->prior; if (p==q) break; /*数据结点为偶数的情况*/ p=p->next; } return same; }
特别要注意的是队列的假溢出现象:队列中还有剩 余空间但元素却不能进入队列 , 造成这种现象的原因 是由于队列的操作方法所致。
解决队列上溢的方法有以下几种:
(1) 建立一个足够大的存储空间 ,但这样做会造成空 间的使用效率降低。 (2) 当出现假溢出时可采用以下几种方法:
①采用平移元素的方法:每当队列中加入一个元素时, 队列中已有的元素向队头移动一个位臵(当然要有空闲 的空间可供移动);
void Sort(LinkList *&head) { LinkList *p=head->next,*q,*r; if (p!=NULL) /*head有一个或以上的数据结点*/ { r=p->next; /*r保存*p结点后继结点的指针*/
p->next=NULL;
/*构造只含一个数据结点的有序表*/ p=r; while (p!=NULL) { r=p->next;
对应算法如下:
void fun(LinkList *hc, LinkList *&ha, LinkList *&hb) {
LinkList *p=hc->next,*ra,*rb;
ha=hc; ra=ha; /*ha的头结点利用hc的头结点*/ /*ra始终指向ha的末尾结点*/
hb=(LinkList *)malloc(sizeof(LinkList)); /*创建hb头结点*/ rb=hb; /*rb始终指向hb的末尾结点*/
(C) n-i+1
p2=n-1, p3=n-2,
(D) 不确定
答:当p1=n时,输出序列必是n,n-1,…,3,2,1,则有:
…,
pn=1
推断出pi=n-i+1,所以本题答案为C。
例3.4 设n个元素进栈序列是1,2,3,…,n,其输出序 列是p1,p2,…,pn,若p1=3,则p2的值 。 (A) 一定是2 (C) 不可能是1 (B) 一定是1 (D) 以上都不对
解: 设拆分后的两个线性表都用带头结点的单链表 存放。 先建立两个头结点 *ha和 *hb,它们用于存放拆分后 的线性表 A 和 B,ra 和 rb 分别指向这两个单链表的表尾 , 用 p 指针扫描单链表 hc, 将当前结点 *p 链到 ha 未尾 ,p 沿 next域下移一个结点,若不为空,则当前结点*p链到hb未 尾 ,p 沿 next 域下移一个结点 , 如此这样 , 直到 p 为空。最 后将两个尾结点的next域臵空。
对应的算法如下:
typedef struct { ElemType data[MaxSize]; int front; int count; } QuType; /*队首指针*/ /*队列中元素个数*/ /*队列类型*/
void InitQu(QuType *&q) /*队列q初始化*/
{ q=(QuType *)malloc(sizeof(QuType)); q->front=0; q->count=0;
②每当删除一个队头元素时 ,则依次移动队中的
元素,始终使front指针指向队列中的第一个位臵;
③采用循环队列方式:把队列看成一个首尾相接
的循环队列,在循环队列上进行插入或删除运算时仍
然遵循“先进先出”的原则。
例 3.7 对于顺序队列来说 , 如果知道队首元素的位
臵和队列中元素个数 , 则队尾元素所在位臵显然是可
}
int EnQu(QuType *&q,ElemType x) /*进队*/ { int rear; if (q->count==MaxSize) return 0; /*队满上溢出*/ else { rear=(q->front+q->count+MaxSize)%MaxSize; /*求队尾位臵*/ rear=(rear+1)%MaxSize; /*队尾位臵进1*/ q->data[rear]=x; q->count++; return 1; } }
void delnode1(SqList &A,ElemType item)
{
int k=0,i; /*k记录值不等于item的元素个数*/
for (i=0;i<A.length;i++) if (A.data[i]!=item) { A.data[k]=A.data[i]; k++; /*不等于item的元素增1*/ } A.length=k; /*顺序表A的长度等于k*/ 算法1:类似于 建顺序表
相关文档
最新文档