数据结构肖启宏课后习题答案第五章
数据结构(C语言版清华大学出版社)-章课后部分答案
![数据结构(C语言版清华大学出版社)-章课后部分答案](https://img.taocdn.com/s3/m/7e5a267f79563c1ec4da7152.png)
第八章选择题1. C2.A3.B4.C5.D6.B7.B8.A9.D 10.D 11.C 12.C填空题1.n、n+12. 43.8.25( 折半查找所在块 )4.左子树、右子树5.266.顺序、(n+1)/2、O(log2n)7.m-1、[m/2]-18.直接定址应用题1.进行折半查找时,判定树是唯一的,折半查找过程是走了一条从根节点到末端节点的路径,所以其最大查找长度为判定树深度[log2n]+1.其平均查找长度约为[log2n+1]-1.在二叉排序树上查找时,其最大查找长度也是与二叉树的深度相关,但是含有n个节点的二叉排序树不是唯一的,当对n个元素的有序序列构造一棵二叉排序树时,得到的二叉排序树的深度也为n,在该二叉树上查找就演变成顺序查找,此时的最大查找长度为n;在随机情况下二叉排序树的平均查找长度为1+4log2n。
因此就查找效率而言,二分查找的效率优于二叉排序树查找,但是二叉排序树便于插入和删除,在该方面性能更优。
3. 评价哈希函数优劣的因素有:能否将关键字均匀的映射到哈希表中,有无好的处理冲突的方法,哈希函数的计算是否简单等。
冲突的概念:若两个不同的关键字Ki和Kj,其对应的哈希地址Hash(Ki) =Hash(Kj),则称为地址冲突,称Ki和K,j为同义词。
(1)开放定址法(2)重哈希法(3)链接地址法4.(1)构造的二叉排序树,如图(2)中序遍历结果如下:10 12 15 20 24 28 30 35 46 50 55 68(4)平均查找长度如下:ASLsucc = (1x1+2x2+3x3+4x3+5x3)/12 = 41/128.哈希地址如下:H(35) = 35%11 = 2H(67) = 67%11 = 1H(42) = 42%11 = 9H(21) = 21%11 = 10H(29) = 29%11 = 7H(86) = 86%11 = 9H(95) = 95%11 = 7H(47) = 47%11 = 3H(50) = 50%11 = 6H(36) = 36%11 = 3H(91) = 91%11 = 3第九章选择题1. D2.C3.B4.D5.C6.B7.A8.A9.D 10.D填空题1.插入排序、交换排序、选择排序、归并排序2.移动(或者交换)3.归并排序、快速排序、堆排序4.保存当前要插入的记录,可以省去在查找插入位置时的对是否出界的判断5.O(n)、O(log2n)6.直接插入排序或者改进了的冒泡排序、快速排序7.Log2n、n8.完全二叉树、n/29.1510.{12 38 25 35 50 74 63 90}应用题11.(1)Shell排序(步长为5 3 1)每趟的排序结果初始序列为100 87 52 61 27 170 37 45 61 118 14 88 32步长为5的排序14 37 32 61 27 100 87 45 61 118 170 88 52步长为3的排序结果14 27 32 52 37 61 61 45 88 87 170 100 118步长为1的排序结果14 27 32 37 45 52 61 61 87 88 100 118最后结果14 27 32 37 45 52 61 61 87 88 100 118 170(2)快速排序每趟的排序结果如图初始序列100 87 52 61 27 170 37 45 61 118 14 88 32第一趟排序[32 87 52 61 27 88 37 45 61 14]100[118 170]第二趟排序[14 27]32[61 52 88 37 45 61 87]100 118[170]第三趟排序14[27]32[45 52 37]61[88 61 87]100 118[170]第四趟排序14[27]32[37]45[52]61[87 61]88 100 118[170]第五趟排序14[27]32[37]45[52]61[87 61]88 100 118[170]最后结果14[27]32[37]45[52]61[61]87 88 100 118[170](3)二路归并排序每趟的排序结果初始序列[100][87][52][61][27][170][37][45][61][118][14][88][32]第一趟归并[87 100][52 61][27 170][37 45][61 118][14 88][32]第二趟归并[52 61 87 100][27 37 45 170][14 61 88 118][32]第三趟归并排序[27 37 45 52 61 87 100 170][14 32 61 88 118]第四趟归并排序[14 27 32 37 45 52 61 61 87 88 100 118 170]最后结果14 27 32 37 45 52 61 61 87 88 100 118 17012.采用快速排序时,第一趟排序过程中的数据移动如图:算法设计题1.分析:为讨论方便,待排序记录的定义为(后面各算法都采用此定义):#define MAXSIZE 100 /* 顺序表的最大长度,假定顺序表的长度为100 */ typedef int KeyType; /* 假定关键字类型为整数类型 */typedef struct {KeyType key; /* 关键字项 */OtherType other; /* 其他项 */}DataType; /* 数据元素类型 */typedef struct {DataType R[MAXSIZE+1]; /* R[0]闲置或者充当哨站 */int length; /* 顺序表长度 */}sqList; /* 顺序表类型 */设n个整数存储在R[1..n]中,因为前n-2个元素有序,若采用直接插入算法,共要比较和移动n-2次,如果最后两个元素做一个批处理,那么比较次数和移动次数将大大减小。
数据结构肖启宏课后习题答案第四章
![数据结构肖启宏课后习题答案第四章](https://img.taocdn.com/s3/m/f9cf4c42b52acfc789ebc94e.png)
一. 名词解释(1)栈——只允许在一端进行插入或删除操作的线性表称为栈。
其最大的特点是“后进先出”。
(2)顺序栈——采用顺序存储结构的栈称为顺序栈。
(3)链栈——采用链式存储结构的栈称为链栈。
(5)队列——只允许在一端进行插入,另一端进行删除操作的线性表称为队列。
其最大的特点是“先进先出”。
(6)顺序队列——采用顺序存储结构的队列称为顺序队列。
(7)链队列——采用链式存储结构的称队列为链队列。
(8)循环队列——为了解决顺序队列中“假溢出”现象,将队列的存储空间想象为一个首尾相链的环(即把队头元素与对尾元素链结起来),存储在其中的队列称为循环队列。
二.判断题(下列各题,正确的请在前面的括号内打√;错误的打ㄨ)(1)√(2)√(3)ㄨ(4)ㄨ(5)ㄨ(6)ㄨ(7)√(8)√(9)ㄨ(10)√(11)ㄨ(12)ㄨ三. 填空题(1)后进先出(2)栈顶栈底(3)栈空栈满(4)O(1)O(1)(5)必须一致(6)栈(7)栈空(8)p->next=top top=p(9)- - + +(10)LS->next 首(11)先进先出(12)队尾队头(13)队列是否为空队列是否为满(14)可变的(15)-1 NULL(16)O(n) O(1) O(1) O(1)(17)front==rear front==(rear+1)% MAXLEN MAXLEN-front (18)空只含有一个结点(19)front==rear && front <>NULL(20)队尾指针写入四. 选择题(1)C (2)A (3)D (4)B (5)C(6)D (7)B (8)A (9)A (10)D(11)A (12)A (13)C (14)A (15)B (16) A五、简答题答:n个(同类)数据元素的有限序列称为线性表。
线性表的特点是数据元素之间存在“一对一”的关系。
栈和队列都是操作受限制的线性表,它们和线性表一样,数据元素之间都存在“一对一”的关系。
数据结构第五章 查找 答案
![数据结构第五章 查找 答案](https://img.taocdn.com/s3/m/af707181360cba1aa811da50.png)
数据结构与算法上机作业第五章查找一、选择题1、若构造一棵具有n个结点得二叉排序树,在最坏情况下,其高度不超过 B 。
A、n/2B、nC、(n+1)/2D、n+12、分别以下列序列构造二叉排序数(二叉查找树),与用其她3个序列所构造得结果不同得就是 C :A、(100, 80, 90, 60, 120, 110, 130)B、(100, 120, 110, 130, 80, 60, 90)C、(100, 60, 80, 90, 120, 110, 130)D、(100, 80, 60, 90, 120, 130, 110)3、不可能生成下图所示得二叉排序树得关键字得序列就是 A 。
A、4 5 3 1 2B、4 2 5 3 1C、4 5 2 1 3D、4 2 3 1 54、在二叉平衡树中插入一个结点造成了不平衡,设最低得不平衡点为A,并已知A得左孩子得平衡因子为0,右孩子得平衡因子为1,则应作 C 型调整使其平衡。
A、LLB、LRC、RLD、RR5、一棵高度为k得二叉平衡树,其每个非叶结点得平衡因子均为0,则该树共有 C 个结点。
A、2k11B、2k1+1C、2k1D、2k+16、具有5层结点得平衡二叉树至少有 A 个结点。
A、12B、11C、10D、97、下面关于B与B+树得叙述中,不正确得就是 C 。
A、B树与B+树都就是平衡得多叉树B、B树与B+树都可用于文件得索引结构C、B树与B+树都能有效地支持顺序检索D、B树与B+树都能有效地支持随机检索8、下列关于m阶B树得说法错误得就是 D 。
A、根结点至多有m棵子树B、所有叶子结点都在同一层次C、非叶结点至少有m/2(m为偶数)或m/2+1(m为奇数)棵子树D、根结点中得数据就是有序得9、下面关于哈希查找得说法正确得就是 C 。
A、哈希函数构造得越复杂越好,因为这样随机性好,冲突小B、除留余数法就是所有哈希函数中最好得C、不存在特别好与坏得哈希函数,要视情况而定D、若需在哈希表中删去一个元素,不管用何种方法解决冲突都只要简单地将该元素删去即可10、与其她查找方法相比,散列查找法得特点就是 C 。
《数据结构》第二版严蔚敏课后习题作业参考答案(1-7章)
![《数据结构》第二版严蔚敏课后习题作业参考答案(1-7章)](https://img.taocdn.com/s3/m/1db6417dbf1e650e52ea551810a6f524ccbfcba0.png)
《数据结构》第二版严蔚敏课后习题作业参考答案(1-7章)【第一章绪论】1. 数据结构是计算机科学中的重要基础知识,它研究的是如何组织和存储数据,以及如何通过高效的算法进行数据的操作和处理。
本章主要介绍了数据结构的基本概念和发展历程。
【第二章线性表】1. 线性表是由一组数据元素组成的数据结构,它的特点是元素之间存在着一对一的线性关系。
本章主要介绍了线性表的顺序存储结构和链式存储结构,以及它们的操作和应用。
【第三章栈与队列】1. 栈是一种特殊的线性表,它的特点是只能在表的一端进行插入和删除操作。
本章主要介绍了栈的顺序存储结构和链式存储结构,以及栈的应用场景。
2. 队列也是一种特殊的线性表,它的特点是只能在表的一端进行插入操作,而在另一端进行删除操作。
本章主要介绍了队列的顺序存储结构和链式存储结构,以及队列的应用场景。
【第四章串】1. 串是由零个或多个字符组成的有限序列,它是一种线性表的特例。
本章主要介绍了串的存储结构和基本操作,以及串的模式匹配算法。
【第五章数组与广义表】1. 数组是一种线性表的顺序存储结构,它的特点是所有元素都具有相同数据类型。
本章主要介绍了一维数组和多维数组的存储结构和基本操作,以及广义表的概念和表示方法。
【第六章树与二叉树】1. 树是一种非线性的数据结构,它的特点是一个节点可以有多个子节点。
本章主要介绍了树的基本概念和属性,以及树的存储结构和遍历算法。
2. 二叉树是一种特殊的树,它的每个节点最多只有两个子节点。
本章主要介绍了二叉树的存储结构和遍历算法,以及一些特殊的二叉树。
【第七章图】1. 图是一种非线性的数据结构,它由顶点集合和边集合组成。
本章主要介绍了图的基本概念和属性,以及图的存储结构和遍历算法。
【总结】1. 数据结构是计算机科学中非常重要的一门基础课程,它关注的是如何高效地组织和存储数据,以及如何通过算法进行数据的操作和处理。
本文对《数据结构》第二版严蔚敏的课后习题作业提供了参考答案,涵盖了第1-7章的内容。
数据结构第五章考试题库(含答案)
![数据结构第五章考试题库(含答案)](https://img.taocdn.com/s3/m/cef98f1b4b7302768e9951e79b89680203d86b75.png)
第 5 章数组和广义表一、选择题为第一元素,其存储地址为1,1.设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a11的地址为()。
【燕山大学 2001 一、2 (2分)】每个元素占一个地址空间,则a85A. 13B. 33C. 18D. 402. 有一个二维数组A[1:6,0:7] 每个数组元素用相邻的6个字节存储,存储器按字节编址,那么这个数组的体积是(①)个字节。
假设存储数组元素A[1,0]的第一个字节的地址是0,则存储数组A的最后一个元素的第一个字节的地址是(②)。
若按行存储,则A[2,4]的第一个字节的地址是(③)。
若按列存储,则A[5,7]的第一个字节的地址是(④)。
就一般情况而言,当(⑤)时,按行存储的A[I,J]地址与按列存储的A[J,I]地址相等。
供选择的答案:【上海海运学院 1998 二、2 (5分)】①-④: A.12 B. 66 C. 72 D. 96 E. 114 F. 120G. 156 H. 234 I. 276 J. 282 K. 283 L. 288⑤: A.行与列的上界相同 B. 行与列的下界相同C. 行与列的上、下界都相同D. 行的元素个数与列的元素个数相同3. 设有数组A[i,j],数组的每个元素长度为3字节,i的值为1 到8 ,j的值为1 到10,数组从内存首地址BA开始顺序存放,当用以列为主存放时,元素A[5,8]的存储首地址为( )。
A. BA+141B. BA+180C. BA+222D. BA+225【南京理工大学 1997 一、8 (2分)】4. 假设以行序为主序存储二维数组A=array[1..100,1..100],设每个数据元素占2个存储单元,基地址为10,则LOC[5,5]=()。
【福州大学 1998 一、10 (2分)】A. 808B. 818C. 1010D. 10205. 数组A[0..5,0..6]的每个元素占五个字节,将其按列优先次序存储在起始地址为1000的内存单元中,则元素A[5,5]的地址是( )。
数据结构-C语言版-第二版(严蔚敏)-第5章--树和二叉树-答案
![数据结构-C语言版-第二版(严蔚敏)-第5章--树和二叉树-答案](https://img.taocdn.com/s3/m/1697301f1611cc7931b765ce05087632311274b6.png)
第5章 树和二叉树1. 选择题(1)把一棵树转换为二叉树后, 这棵二叉树的形态是( )。
A. 唯一的 B. 有多种C .有多种, 但根结点都没有左孩子 D.有多种, 但根结点都没有右孩子 答案: A解释:因为二叉树有左孩子、右孩子之分, 故一棵树转换为二叉树后, 这棵二叉树的形态是唯一的。
(2)由3个结点可以构造出多少种不同的二叉树? ( ) A. 2 B. 3 C. 4 D. 5 答案:D解释: 五种情况如下:(3)一棵完全二叉树上有1001个结点, 其中叶子结点的个数是( )。
A. 250B. 500C. 254D. 501 答案:D解释: 设度为0结点(叶子结点)个数为A, 度为1的结点个数为B, 度为2的结点个数为C, 有A=C+1, A+B+C=1001, 可得2C+B=1000, 由完全二叉树的性质可得B=0或1, 又因为C 为整数, 所以B=0, C=500, A=501, 即有501个叶子结点。
(4)一个具有1025个结点的二叉树的高h 为( )。
A. 11B. 10C. 11至1025之间D. 10至1024之间 答案:C解释: 若每层仅有一个结点, 则树高h 为1025;且其最小树高为 (log21025( + 1=11, 即h 在11至1025之间。
(5)深度为h 的满m 叉树的第k 层有( )个结点。
(1=<k=<h) A. mk-1 B. mk-1 C. mh-1 D. mh-1 答案:A解释: 深度为h 的满m 叉树共有mh-1个结点, 第k 层有mk-1个结点。
(6)利用二叉链表存储树, 则根结点的右指针是( )。
A. 指向最左孩子B. 指向最右孩子C. 空D. 非空 答案:C解释: 利用二叉链表存储树时, 右指针指向兄弟结点, 因为根节点没有兄弟结点, 故根节点的右指针指向空。
(7)对二叉树的结点从1开始进行连续编号, 要求每个结点的编号大于其左、右孩子的编号, 同一结点的左右孩子中, 其左孩子的编号小于其右孩子的编号, 可采用( )遍历实现编号。
数据结构与算法第5章课后答案
![数据结构与算法第5章课后答案](https://img.taocdn.com/s3/m/bcfd2785bceb19e8b8f6ba2b.png)
page: 1The Home of jetmambo - 第 5 章树和二叉树第 5 章树和二叉树(1970-01-01) -第 5 章树和二叉树课后习题讲解1. 填空题⑴树是n(n≥0)结点的有限集合,在一棵非空树中,有()个根结点,其余的结点分成m (m>0)个()的集合,每个集合都是根结点的子树。
【解答】有且仅有一个,互不相交⑵树中某结点的子树的个数称为该结点的(),子树的根结点称为该结点的(),该结点称为其子树根结点的()。
【解答】度,孩子,双亲⑶一棵二叉树的第i(i≥1)层最多有()个结点;一棵有n(n>0)个结点的满二叉树共有()个叶子结点和()个非终端结点。
【解答】2i-1,(n+1)/2,(n-1)/2【分析】设满二叉树中叶子结点的个数为n0,度为2的结点个数为n2,由于满二叉树中不存在度为1的结点,所以n=n0+n2;由二叉树的性质n0=n2+1,得n0=(n+1)/2,n2=(n-1)/2。
⑷设高度为h的二叉树上只有度为0和度为2的结点,该二叉树的结点数可能达到的最大值是(),最小值是()。
【解答】2h -1,2h-1【分析】最小结点个数的情况是第1层有1个结点,其他层上都只有2个结点。
⑸深度为k的二叉树中,所含叶子的个数最多为()。
【解答】2k-1【分析】在满二叉树中叶子结点的个数达到最多。
⑹具有100个结点的完全二叉树的叶子结点数为()。
【解答】50【分析】100个结点的完全二叉树中最后一个结点的编号为100,其双亲即最后一个分支结点的编号为50,也就是说,从编号51开始均为叶子。
⑺已知一棵度为3的树有2个度为1的结点,3个度为2的结点,4个度为3的结点。
则该树中有()个叶子结点。
【解答】12【分析】根据二叉树性质3的证明过程,有n0=n2+2n3+1(n0、n2、n3分别为叶子结点、度为2的结点和度为3的结点的个数)。
⑻某二叉树的前序遍历序列是ABCDEFG,中序遍历序列是CBDAFGE,则其后序遍历序列是()。
数据结构肖启宏课后习题答案第六章
![数据结构肖启宏课后习题答案第六章](https://img.taocdn.com/s3/m/50317a224a7302768e9939f0.png)
一.名词解释(1)结点—— 树的结点包含一个数据及若干指向其子树的分支。
(2)结点的度—— 结点所拥有的子树数称为该结点的度。
(3)树的度—— 树中各结点度的最大值称为该树的度。
(4)二叉树—— 一棵非空的二叉树,每个结点至多只有两棵子树,分别称为左子树和右子树,左、右子树的次序不能任意交换,且左右子树又分别是一棵二叉树。
(5)哈夫曼树—— 带权路径长度最小的二叉树,即最优二叉树,也称为哈夫曼树。
二.判断题(下列各题,正确的请在前面的括号内打√;错误的打ㄨ) (1)√ (2)ㄨ (3)√ (4)√(5)√(6)ㄨ (7)ㄨ(8)√三.填空题1.结点拥有的子树数 2.度为零的3. 树内各结点度的最大值 4.深度(或高度) 5.2i-1 6. 2h -1 7. n-1 8.6 9.中序 10.5 11.20 12. ⎣⎦1log 2+n13.顺序存储结构和链式存储结构 14.最小 15.EBCAD16.(1) ABEFHCG (2).EBHFACG (3).EHFBGCA 17.空二叉树 18.4四.选择题(1)B (2)C (3)C (4)C (5)D(6)B (7)A (8)B (9)D (10)D(11)B (12)A (13)C五.简答题1.答:一般树(非空)除了根结点之外,每个结点有且仅有一个前驱结点,但每个结点都可以有多个互不相交的子集(后继结点)。
二叉树(若非空)除了根结点之外,每个结点有且仅有一个前驱结点,但每个结点至多只有两个后继结点,称为左子树和右子树,左、右子树的次序不能交换,且左右子树又分别都是二叉树。
一般树和二叉树主要有以下区别:二叉树结点的度最大为2,而一般树结点的最大度数无限制;一般树的结点无左、右之分,而二叉树的结点有左、右之分。
2.答:一棵度为2的树与一棵二叉树的区别在于:对于度为1的结点,度为2的树无须区分左右;对于二叉树必须有左右之分,且不能任意交换。
3.答:(1)A是根结点。
《数据结构》第五章习题参考答案
![《数据结构》第五章习题参考答案](https://img.taocdn.com/s3/m/61e8cc30c281e53a5802ffe2.png)
《数据结构》第五章习题参考答案一、判断题(在正确说法的题后括号中打“√”,错误说法的题后括号中打“×”)1、知道一颗树的先序序列和后序序列可唯一确定这颗树。
( ×)2、二叉树的左右子树可任意交换。
(×)3、任何一颗二叉树的叶子节点在先序、中序和后序遍历序列中的相对次序不发生改变。
(√)4、哈夫曼树是带权路径最短的树,路径上权值较大的结点离根较近。
(√)5、用一维数组存储二叉树时,总是以前序遍历顺序存储结点。
( ×)6、完全二叉树中,若一个结点没有左孩子,则它必是叶子结点。
( √)7、一棵树中的叶子数一定等于与其对应的二叉树的叶子数。
(×)8、度为2的树就是二叉树。
(×)二、单项选择题1.具有10个叶结点的二叉树中有( B )个度为2的结点。
A.8 B.9 C.10 D.112.树的后根遍历序列等同于该树对应的二叉树的( B )。
A. 先序序列B. 中序序列C. 后序序列3、二叉树的先序遍历和中序遍历如下:先序遍历:EFHIGJK;中序遍历:HFIEJKG 。
该二叉树根的右子树的根是:( C )A. EB. FC. GD. H04、在下述结论中,正确的是( D )。
①具有n个结点的完全二叉树的深度k必为┌log2(n+1)┐;②二叉树的度为2;③二叉树的左右子树可任意交换;④一棵深度为k(k≥1)且有2k-1个结点的二叉树称为满二叉树。
A.①②③B.②③④C.①②④D.①④5、某二叉树的后序遍历序列与先序遍历序列正好相反,则该二叉树一定是( D )。
A.空或只有一个结点B.完全二叉树C.二叉排序树D.高度等于其结点数三、填空题1、对于一棵具有n个结点的二叉树,对应二叉链接表中指针总数为__2n____个,其中___n-1_____个用于指向孩子结点,___n+1___个指针空闲着。
2、一棵深度为k(k≥1)的满二叉树有_____2k-1______个叶子结点。
数据结构考试试题库含答案解析
![数据结构考试试题库含答案解析](https://img.taocdn.com/s3/m/3547161d102de2bd97058866.png)
数据结构习题集含答案目录目录 (1)选择题 (2)第一章绪论 (2)第二章线性表 (4)第三章栈和队列 (6)第四章串 (7)第五章数组和广义表 (8)第六章树和二叉树 (8)第七章图 (11)第八章查找 (13)第九章排序 (14)简答题 (19)第一章绪论 (19)第二章线性表 (24)第三章栈和队列 (26)第四章串 (28)第五章数组和广义表 (29)第六章树和二叉树 (31)第七章图 (36)第八章查找 (38)第九章排序 (39)编程题 (41)第一章绪论 (41)第二章线性表 (41)第三章栈和队列 (52)第四章串 (52)第五章数组和广义表 (52)第六章树和二叉树 (52)第七章图 (52)第八章查找 (52)第九章排序 (57)选择题第一章绪论1.数据结构这门学科是针对什么问题而产生的?(A )A、针对非数值计算的程序设计问题B、针对数值计算的程序设计问题C、数值计算与非数值计算的问题都针对D、两者都不针对2.数据结构这门学科的研究内容下面选项最准确的是(D )A、研究数据对象和数据之间的关系B、研究数据对象C、研究数据对象和数据的操作D、研究数据对象、数据之间的关系和操作3.某班级的学生成绩表中查得张三同学的各科成绩记录,其中数据结构考了90分,那么下面关于数据对象、数据元素、数据项描述正确的是(C )A、某班级的学生成绩表是数据元素,90分是数据项B、某班级的学生成绩表是数据对象,90分是数据元素C、某班级的学生成绩表是数据对象,90分是数据项D、某班级的学生成绩表是数据元素,90分是数据元素4.*数据结构是指(A )。
A、数据元素的组织形式B、数据类型C、数据存储结构D、数据定义5.数据在计算机存储器内表示时,物理地址与逻辑地址不相同,称之为(C )。
A、存储结构B、逻辑结构C、链式存储结构D、顺序存储结构6.算法分析的目的是(C )A、找出数据的合理性B、研究算法中的输入和输出关系C、分析算法效率以求改进D、分析算法的易懂性和文档型性7.算法分析的主要方法(A )。
数据结构课后习题及解析第五章
![数据结构课后习题及解析第五章](https://img.taocdn.com/s3/m/1fa8bbb01ed9ad51f11df270.png)
第五章习题5.1 假设有6行8列的二维数组A,每个元素占用6个字节,存储器按字节编址。
已知A的基地址为1000,计算:数组A共占用多少字节;数组A的最后一个元素的地址;按行存储时元素A36的地址;按列存储时元素A36的地址;5.2 设有三对角矩阵An×n ,将其三条对角线上的元素逐行地存于数组B(1:3n-2)中,使得B[k]= aij,求:(1)用i,j表示k的下标变换公式;(2)用k表示i,j的下标变换公式。
5.3假设稀疏矩阵A和B均以三元组表作为存储结构。
试写出矩阵相加的算法,另设三元组表C存放结果矩阵。
5.4在稀疏矩阵的快速转置算法5.2中,将计算position[col]的方法稍加改动,使算法只占用一个辅助向量空间。
5.5写一个在十字链表中删除非零元素aij的算法。
5.6画出下面广义表的两种存储结构图示:((((a), b)), ((( ), d), (e, f)))5.7求下列广义表运算的结果:(1)HEAD[((a,b),(c,d))];(2)TAIL[((a,b),(c,d))];(3)TAIL[HEAD[((a,b),(c,d))]];(4)HEAD[TAIL[HEAD[((a,b),(c,d))]]];(5)TAIL[HEAD[TAIL[((a,b),(c,d))]]];实习题若矩阵Am×n 中的某个元素aij是第i行中的最小值,同时又是第j列中的最大值,则称此元素为该矩阵中的一个马鞍点。
假设以二维数组存储矩阵,试编写算法求出矩阵中的所有马鞍点。
第五章答案5.2设有三对角矩阵A n×n,将其三条对角线上的元素逐行的存于数组B[1..3n-2]中,使得B[k]=a ij,求:(1)用i,j表示k的下标变换公式;(2)用k表示i、j的下标变换公式。
【解答】(1)k=2(i-1)+j(2) i=[k/3]+1, j=[k/3]+k%3 ([ ]取整,%取余)5.4在稀疏矩阵的快速转置算法5.2中,将计算position[col]的方法稍加改动,使算法只占用一个辅助向量空间。
数据结构名章节习题及答案
![数据结构名章节习题及答案](https://img.taocdn.com/s3/m/25e8ae9bbceb19e8b8f6ba59.png)
p=p->next; } q=p; while (q!=NULL && q->data<max) q=q->next; r->next=q; r=p->next; while (r!=q) } } 3. 解:void dels(ListNode *head) { ListNode *p=head->next , *q, *pre, *r; while (p!=NULL) { q=p->next; pre=p; while (q!=NULL) { if (p->data==q->data) { r=q; pre->next=q->next; q=q->next; free®; } else { pre=q; q=q->next; } } p=p->next; } 4. 解 : 当 L 不空时从头开始扫描 L, 每次扫描找出一个最小值的结点*p1 及其前趋结点*pre1, 输出*p1 之值,再从表中删除。算法如下: void dels(ListNode *L) { ListNode *p, *pre, *pre1, *p1; while (L->next!=NULL) { pre=pre1=L; p=p1=L->next; while (p!=NULL) { if (p->data<p1->data) pre1=pre; p1=p; } pre=p; p=p->next; } cout <<p1->data<<end1; pre1->next=p1->next; free(p1); { { free(p); p=r; r=r->next;
解:由于是有序表,所以相同值域的结都是相信的。同 p 扫描递增单链表,若*p 结点的 值域等于其后结点的值域,删除后者。
数据结构课后习题答案第五章数组与广义表
![数据结构课后习题答案第五章数组与广义表](https://img.taocdn.com/s3/m/b45a84f3d15abe23492f4d00.png)
第五章数组与广义表一、假设有二维数组A6*8,每个元素用相邻的6个字节存储,存储器按字节编址。
已知A的起始存储位置(基地址)为1000。
计算:1、数组A的体积(即存储量);2、数组A的最后一个元素a57的第一个字节的地址;3、按行存储时,元素a14的第一个字节的地址;4、按列存储时,元素a47的第一个字节的地址;答案:1、(6*8)*6=2882、loc(a57)=1000+(5*8+7)*6=1282或=1000+(288-6)=12823、loc(a14)=1000+(1*8+4)*6=10724、loc(a47)=1000+(7*6+4)*6=1276二、假设按低下标(行优先)优先存储整数数组A9*3*5*8时第一个元素的字节地址是100,每个整数占四个字节。
问下列元素的存储地址是什么?(1)a0000(2)a1111(3)a3125 (4)a8247答案:(1)100(2)loc(a1111)=100+(1*3*5*8+1*5*8+1*8+1)*4=776(3) loc(a3125)=100+(3*3*5*8+1*5*8+2*8+5)*4=1784(4) loc(a8247)=100+(8*3*5*8+2*5*8+4*8+7)*4=4416五、设有一个上三角矩阵(aij)n*n,将其上三角元素逐行存于数组B[m]中,(m 充分大),使得B[k]=aij且k=f1(i)+f2(j)+c。
试推导出函数f1,f2和常数C(要求f1和f2中不含常数项)。
答:K=n+(n-1)+(n-2)+…..+(n-(i-1)+1)+j-i=(i-1)(n+(n-i+2))/2+j-i所以f1(i)=(n+1/2)i-1/2i2f2(j)=jc=-(n+1)九、已知A为稀疏矩阵,试从空间和时间角度比较采用两种不同的存储结构(二维数组和三元组表)完成∑aii运算的优缺点。
(对角线求和)解:1、二维数组For(i=1;i<=n;i++)S=s+a[i][i];时间复杂度:O(n)2、for(i=1;i<=m.tu;i++)If(a.data[k].i==a.data[k].j) s=s+a.data[k].value;时间复杂度:O(n2)二十一、当稀疏矩阵A和B均以三元组表作为存储结构时,试写出矩阵相加的算法,其结果存放在三元组表C中。
C++课后习题答案第五章
![C++课后习题答案第五章](https://img.taocdn.com/s3/m/6f0cd365783e0912a2162a23.png)
};
employee emp;
(d) struct
{char name[20];
long code;
}employee;
employee emp;
2.已知有职工情况结构变量emp定义为:
struct employee
{char name[20];
long code;
struct
{int year;
node *q;
};
void main()
{node a[]={{"Mary",a+1},{"Jack",a+2},{"Jim",a}};
node *p=a;
cout<<p->s<<endl;
cout<<p->q->s<<endl;
cout<<p->q->q->s<<endl;
cout<<p->q->q->q->s<<endl;
{ cout<<"a="<<c.a<<'\t'<<"b="<<c.b<<endl; }
private:
int a;
static int b;
};
int T::b=5;
void main()
{T A(3),B(5);
T::display(A);
T::display(B);
}
答案:
a=3 b=13
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一.名词解释串:串(string)是由零个或多个字符组成的有限序列。
一般记为S=“a1 a2...an”(n≥0)其中,S是串名,用双引号或单引号括起来的字符序列是串的值,ai(1≤i≤n)称为串的元素,它可以是字母、数字、空格或其他字符。
串中字符的个数n称为串的长度。
广义表:广义表(Generalized Lists)是n (n≥0)个数据元素a1, a2,…,ai…,an的有序序列,一般记作:ls= (a1,a2,…,ai,…,an)其中:ls是广义表的名称,n是它的长度。
每个ai(1≤i≤n)是ls的成员,它可以是单个元素,称为广义表ls的原子,也可以是一个广义表,称为广义表的子表。
当广义表ls非空时,称第一个元素a1为ls的表头(head),称其余元素组成的表(a2,…,ai,…,an)为ls 的表尾( tail)。
广义表的定义是递归的。
二.判断题(下列各题,正确的请在前面的括号内打√;错误的打ㄨ)(1)ㄨ(2)√(3)ㄨ(4)ㄨ(5)√(6)√(7)ㄨ(8)√(9)ㄨ(10)√三.填空题(10个)1.长度2.空串零3.顺序存储4.数据指针数据指针5.模式匹配6.顺序存储和链式存储7.(a)(((b),c),(((d))))8.广义表四.选择题1.B 2.D 3.B 4.C 5.C 6.A 7.B 8.A五.简答题1.简述串的存储结构及各自的特点。
串的存储方式有主要有顺序存储、堆分配存储和链式存储。
顺序结构:用一组地址连续的存储单元存储串的字符序列,构成串的顺序存储,简称为顺序串。
特点:这种结构是按照预设大小,为每个定义的串变量分配一个固定长度的存储区。
因此存在存储空间的越界或浪费的问题。
对于操作如查找但是操作简单方便。
堆分配存储结构:在内存中开辟地址连续的存储空间作为串的可利用存储空间,称为堆空间,根据每个串的长度,动态地为每个串在堆空间里申请相应大小的存储区域的一种存储结构。
特点:以一组地址连续的存储单元存放串的字符序列,但其存储空间是在算法执行过程中动态分配得到的,串也是顺序存储在所申请的存储区域中。
由于堆分配存储结构的串既有顺序存储结构的特点,又没有造成对存储空间的浪费和对串长加以限制,使用非常灵活。
链式存储结构:是将存储区域分成一系列大小相同的结点,每个结点有两个域即数据域data 和指针域next。
其中数据域用于存放字符串元素,指针域用于存放下一个结点的地址。
特点:在串中使用链式存储结构同样是在插入、删除等操作中没有移动元素所带来的时间耗费,存储空间的扩展容易;但结点的容量会带来存储空间的利用率降低。
2.广义表具有哪些性质?(1) 广义表是一种多层次的数据结构。
广义表的元素可以是原子,也可以是子表,而子表的元素还可以是子表。
(2) 广义表可以是递归的表。
广义表的定义并没有限制元素的递归,即广义表也可以是其自身的子表。
例如表E就是一个递归的表。
(3) 广义表可以为其他表所共享。
例如D=(A, B, C)时,表A、B、C是表D的共享子表。
在D中可以不必列出子表的值,而用子表的名称来引用。
六.下述算法的功能是什么(1)实现串S和串T的连接运算。
(2)返回串S中从第n1个字符开始取n2个字符组成的子串。
七.程序设计题1.写一个递归算法来实现字符的逆序存储,要求不另设存储空间。
#include "stdio.h"#include MAXSIZE 80char next[MAXSIZE80]; /*串的最大长度*/void reverse ( int n) /*递归函数实现逆置*/{if(n<=1){next[n]=getchar();putchar(next[n]);}else{next[n]=getchar();reverse (n-1);putchar(next[n]);}}main(){int i;printf("请输入字符串长度值!\n");scanf("%d",&i);getchar();palin(i); /*调用逆置函数*/printf("\n");}2.编写算法实现将串S中的第i个字符到第j个字符之间的字符(不包括第i个字符和第j 个字符)用串T替换。
#include <stdio.h>#define MAXSIZE 80typedef struct{char ch[MAXSIZE];int len;}SEQSTRING;SEQSTRING S,T,S1;void replace(SEQSTRING S,int i,int j,SEQSTRING T) /*替换操作函数*/{SEQSTRING S1;int h,k;if(i<S.len && j<S.len) /*把i前的字符存入结果串中*/{for(h=0;h<i;h++)S1.ch[h]=S.ch[h];S1.len=i;h=0;while(h<T.len) /*把替换串联接入结果串*/{S1.ch[S1.len+h]=T.ch[h];h++;}S1.len=S1.len+T.len;h=j;for(k=S1.len;h<=S.len;k++,h++) /*把j后的串接入结果串中*/S1.ch[k]=S.ch[h-1];S1.len=k; /*修改字符串总长度*/S1.ch[S1.len]='\0';puts(S.ch);puts(T.ch);puts(S1.ch);}elseprintf("error\n");return;}main(){int i,j;S.len=0;T.len=0;S1.len=0;printf("请输入串S和T!\n");gets(S.ch);gets(T.ch);for(i=0;S.ch[i]!='\0';i++) /*计量串S的长度*/S.len++;for(i=0;T.ch[i]!='\0';i++) /*计量串T的长度*/T.len++;printf("请输入替换字符的位置序号i和j:");scanf("%d,%d",&i,&j);getchar();replace(S,i,j,T); /*调用替换函数*/}3.一个仅由字母组成的字符串S,长度为n,其结构为单链表,每个结点的数据域只存放一个字母。
设计一个算法,去掉字符串中所有值为x的字母。
#include <stdio.h>#include <malloc.h>#define NULL 0typedef struct CHUNK{char data;struct CHUNK *next;}LinkList;void delx(LinkList *s,char x) /*从串s中删除所有取值为x的函数*/ { LinkList *p,*q,*r;int w;p=s;w=1; /*是否第一个节点的标志位*/while(p->next!=NULL){if(w==1) /*处理第一个节点*/if(p->data==x) /*如果第一个节点取值为x*/{s=p->next;free(p);p=s;}else /*如果第一个节点取值不是x*/{q=p;p=p->next;w=0;}else /*处理其它节点*/{if(p->data==x) /*删除值为x的节点*/{ q->next=p->next;free(p);p=q->next;}else{q=p;p=p->next;}}}p=s;printf("\n 处理结果为:\n"); /*输出结果以便观察*/while(p->next!=NULL){printf("%c",p->data);p=p->next;}printf("\n");}main() /*主函数*/{ int i,j;char ch,x;LinkList *s,*p,*r;p=malloc(sizeof(LinkList)); /*申请链的头结点*/p->data='';p->next=NULL;s=p; /*存放结果的指针变量指向它*/ch='';j=0;printf("请输入字符串中的元素值,以’#’号结束输入!\n");while(ch!='#'){scanf("%c",&ch);getchar();r=malloc(sizeof(LinkList)); /*为输入的字符申请存储空间并由r指向它*/r->data=ch; /*在新空间中存入信息*/r->next=NULL;p->next=r;p=r;j++; /*字符串长度是否为空标志,j不为0表示非空串*/ }p=s;while(p->next!=NULL) /*输出原串结果以便观察*/{printf("%c",p->data);p=p->next;}if(j>1) /*如果串值不为空,调用删除字符处理函数*/{printf("input x ");scanf("%c",&x);printf("\n");delx(s,x); /*以串s 和字符x值调用删除字符处理函数*/}}4.编写算法,求串S中所含不同字符的总数和每种字符的个数。
#include <stdio.h>#define MAXSIZE 80typedef struct{char ch[MAXSIZE];int len;}SEQSTRING;SEQSTRING S,T;SEQSTRING InputStr() /*输入字符串函数*/{ int i;T.len=0;printf("请输入字符串:\n");gets(T.ch);for(i=0;T.ch[i]!='\0';i++)T.len++;return T;}main(){ char z[10];int i=0,j=0,m=0,l;int n=0;int r[10]={0}; /*存储重复字符个数*/int log[10]={0}; /*存放重复字符标志*/S.len=0;S=InputStr(); /*输入字符*/l=S.len;while(i<l){if(!log[i]) /*如果不是重复字符*/{r[m]=1; /*计算赋值*/z[m]=S.ch[i]; /*在工作数组中记录第一次出现的字符*/j=i+1;while(j<l) /*检测之后的重复字符个数,并置位标志数组*/{if(z[m]==S.ch[j]){r[m]++; /*重复计数*/log[j]=1; /*置标志位*/}j++;}i++;m++;}else{i++;}}for(i=0;i<m;i++) /*输出所有字符的种类*/printf("%c",z[i]);printf("\n");for(i=0;i<m;i++) /*输出每种字符的个数*/printf("%d",r[i]);printf("\n");printf("字符总数为:%d",l)}5.有两个串S1和S2,设计一个算法,求一个串T,使其中的字符是S1和S2中的公共字符。