欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    数据结构c++版课后习题解析(84页).doc

    • 资源ID:36349358       资源大小:780KB        全文页数:84页
    • 资源格式: DOC        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    数据结构c++版课后习题解析(84页).doc

    -第 1 章 绪 论11.1 本章导学11.2 习题解析2第 2 章 线性表92.1 本章导学92.2 习题解析10第 3 章 栈和队列193.1 本章导学193.2 习题解析20第 4 章 字符串和多维数组264.1 本章导学264.2 习题解析27第 5 章 树和二叉树325.1 本章导学325.2 习题解析33第 6 章 图436.1 本章导学436.2 习题解析44第 7 章 查找技术567.1 本章导学567.2 习题解析57第 8 章 排序技术678.1 本章导学678.2 习题解析68第 9 章 索引技术789.1 本章导学789.2 习题解析78-第 82 页-第 1 章 绪 论1.1 本章导学1. 知识结构图 本章的知识结构如图1-1所示,其中第二层的椭圆代表本章的学习主线。数据数据元素数据结构抽象数据类型逻辑结构数据结构的分类存储结构常用存储方法算法算法特性评价算法描述算法问题规模基本语句时间复杂度大O记号图1-1 知识结构图绪 论数据结构算 法基本概念逻辑结构存储结构基本概念算法分析关 系2. 学习要点对本章的学习要从两条主线出发,一条主线是数据结构,包括数据结构的相关概念及含义,另一条主线是算法,包括算法的相关概念、描述方法以及时间复杂度的分析方法。在学习数据结构时要抓住两个方面:逻辑结构和存储结构,并注意把握二者之间的关系。在学习算法时,要以算法的概念和特性为基本点,并在以后的学习中注意提高算法设计的能力。对于算法时间性能的分析,要将注意力集中在增长率上,即基本语句执行次数的数量级,在设计算法时,养成分析算法时间性能的习惯,进而有效地改进算法的效率。1.2 习题解析1. 填空(1)( )是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。【解答】数据元素(2)( )是数据的最小单位,( )是讨论数据结构时涉及的最小数据单位。【解答】数据项,数据元素【分析】数据结构指的是数据元素以及数据元素之间的关系。(3)从逻辑关系上讲,数据结构主要分为( )、( )、( )和( )。【解答】集合,线性结构,树结构、图结构(4)数据的存储结构主要有( )和( )两种基本方法,不论哪种存储结构,都要存储两方面的内容:( )和( )。【解答】顺序存储结构,链接存储结构,数据元素,数据元素之间的关系(5)算法具有五个特性,分别是( )、( )、( )、( )、( )。【解答】有零个或多个输入,有一个或多个输出,有穷性,确定性,可行性(6)算法的描述方法通常有( )、( )、( )和( )四种,其中,( )被称为算法语言。【解答】自然语言,程序设计语言,流程图,伪代码,伪代码(7)在一般情况下,一个算法的时间复杂度是( )的函数。【解答】问题规模(8)设待处理问题的规模为n,若一个算法的时间复杂度为一个常数,则表示成数量级的形式为( ),若为2n*log25n + 8n,则表示成数量级的形式为( )。【解答】(1),(nlog2n)【分析】用大O记号表示算法的时间复杂度,需要将低次幂去掉,将最高次幂的系数去掉。2. 选择题(1)顺序存储结构中数据元素之间的逻辑关系是由( )表示的,链接存储结构中的数据元素之间的逻辑关系是由( )表示的。A 线性结构 B 非线性结构 C 存储位置 D 指针【解答】C,D【分析】顺序存储结构就是用一维数组存储数据结构中的数据元素,其逻辑关系由存储位置(即元素在数组中的下标)表示;链接存储结构中一个数据元素对应链表中的一个结点,元素之间的逻辑关系由结点中的指针表示。(2)假设有如下遗产继承规则:丈夫和妻子可以相互继承遗产;子女可以继承父亲或母亲的遗产;子女间不能相互继承遗产。则表示该遗产继承关系的最合适的数据结构应该是( )。A 树 B 图 C 线性表 D 集合【解答】B【分析】将丈夫、妻子和子女分别作为数据元素,根据继承关系画出逻辑结构图如图1-2丈夫妻子子女n子女1图1-2 遗产继承逻辑结构图所示。(3)计算机所处理的数据一般具有某种内在联系,这是指( )。A 数据和数据之间存在某种关系 B 元素和元素之间存在某种关系C 元素内部具有某种结构 D 数据项和数据项之间存在某种关系【解答】B【分析】数据结构是指相互之间存在一定关系的数据元素的集合,数据元素是讨论数据结构时涉及的最小数据单位,元素内部各数据项一般不予考虑。(4)对于数据结构的描述,下列说法中不正确的是( )。A 相同的逻辑结构对应的存储结构也必相同B 数据结构由逻辑结构、存储结构和基本操作三方面组成C 对数据结构基本操作的实现与存储结构有关D 数据的存储结构是数据的逻辑结构的机内实现【解答】A【分析】相同的逻辑结构可以用不同的存储结构实现,一般来说,在不同的存储结构下基本操作的实现是不同的,例如线性表可以顺序存储也可以链接存储,在顺序存储和链接存储结构下插入操作的实现截然不同。(5)可以用( )定义一个完整的数据结构。A 数据元素 B 数据对象 C 数据关系 D 抽象数据类型【解答】D【分析】抽象数据类型是一个数据结构以及定义在该结构上的一组操作的总称。(6)算法指的是( )。A 对特定问题求解步骤的一种描述,是指令的有限序列。B 计算机程序 C 解决问题的计算方法 D 数据处理【解答】A【分析】计算机程序是对算法的具体实现;简单地说,算法是解决问题的方法;数据处理是通过算法完成的。所以,只有A是算法的准确定义。(7)下面( )不是算法所必须具备的特性。A 有穷性 B 确切性 C 高效性 D 可行性【解答】C【分析】高效性是好算法应具备的特性。(8)算法分析的目的是( ),算法分析的两个主要方面是( )。A 找出数据结构的合理性 B 研究算法中输入和输出的关系C 分析算法的效率以求改进 D 分析算法的易读性和文档性E 空间性能和时间性能 F 正确性和简明性G 可读性和文档性 H 数据复杂性和程序复杂性【解答】C,E3. 判断题 算法的时间复杂度都要通过算法中的基本语句的执行次数来确定。【解答】错。时间复杂度要通过算法中基本语句执行次数的数量级来确定。 每种数据结构都具备三个基本操作:插入、删除和查找。【解答】错。如数组就没有插入和删除操作。此题注意是每种数据结构。 所谓数据的逻辑结构指的是数据之间的逻辑关系。【解答】错。是数据之间的逻辑关系的整体。 逻辑结构与数据元素本身的内容和形式无关。【解答】对。因此逻辑结构是数据组织的主要方面。 基于某种逻辑结构之上的基本操作,其实现是唯一的。【解答】错。基本操作的实现是基于某种存储结构设计的,因而不是唯一的。4. 分析以下各程序段,并用大O记号表示其执行时间。 i = 1; k = 0; while (i <= n) k = k + 10 * i;i+; i = 1; k = 0; do k = k + 10 * i;i+; while (i <= n); y = 0; while (y + 1) *(y + 1) <= n) y = y + 1; i = 1; j = 0;while (i + j <= n) if (i > j) j+; else i+; for (i = 1; i <= n; i+) for (j = 1; j <= i; j+) for (k = 1; k <= j; k+) x+;【解答】 基本语句是k=k+10*i,共执行了n-2次,所以T(n)=O(n)。 基本语句是k=k+10*i,共执行了n次,所以T(n)=O(n)。 分析条件语句,每循环一次,i+j 整体加1,共循环n次,所以T(n)=O(n)。 设循环体共执行T(n)次,每循环一次,循环变量y加1,最终T(n)=y,即: (T(n)+1)2n,所以T(n)=O(n1/2)。 x+是基本语句,所以 5解答下列问题(1)设有数据结构(D,R),其中D = 1, 2, 3, 4, 5, 6,R = (1, 2),(2, 3),(2, 4),(3, 4),(3, 5),(3, 6),(4, 5),(4, 6)。试画出其逻辑结构图并指出属于何种结构。142563图1-3 逻辑结构图【解答】其逻辑结构图如图1-3所示,它是一种图结构。(2)为整数定义一个抽象数据类型,包含整数的常见运算,每个运算对应一个基本操作,每个基本操作的接口需定义前置条件、输入、功能、输出和后置条件。【解答】整数的抽象数据类型定义如下: ADT integer Data 整数:可以是正整数(1, 2, 3, )、负整数(-1, -2, -3, )和零 Operation Constructor 前置条件:整数a不存在 输入:一个整数b 功能:构造一个与输入值相同的整数 输出:无 后置条件:整数a具有输入的值 Set 前置条件:存在一个整数a 输入:一个整数b 功能:修改整数a的值,使之与输入的整数值相同 输出:无 后置条件:整数a的值发生改变 Add 前置条件:存在一个整数a 输入:一个整数b 功能:将整数a与输入的整数b相加 输出:相加后的结果 后置条件:整数a的值发生改变 Sub 前置条件:存在一个整数a 输入:一个整数b 功能:将整数a与输入的整数b相减 输出:相减的结果 后置条件:整数a的值发生改变 Multi 前置条件:存在一个整数a 输入:一个整数b 功能:将整数a与输入的整数b相乘 输出:相乘的结果 后置条件:整数a的值发生改变 Div 前置条件:存在一个整数a 输入:一个整数b 功能:将整数a与输入的整数b相除 输出:若整数b为零,则抛出除零异常,否则输出相除的结果 后置条件:整数a的值发生改变 Mod 前置条件:存在一个整数a 输入:一个整数b 功能:求当前整数与输入整数的模,即正的余数 输出:若整数b为零,则抛出除零异常,否则输出取模的结果 后置条件:整数a的值发生改变 Equal 前置条件:存在一个整数a 输入:一个整数b 功能:判断整数a与输入的整数b是否相等 输出:若相等返回1,否则返回0 后置条件:整数a的值不发生改变endADT(3)求多项式A(x)的算法可根据下列两个公式之一来设计: A(x)=anxn+an-1xn-1+a1x+a0 A(x)=(anx+an-1)x+a1)x)+a0根据算法的时间复杂度分析比较这两种算法的优劣。【解答】第二种算法的时间性能要好些。第一种算法需执行大量的乘法运算,而第二种算法进行了优化,减少了不必要的乘法运算。(4)选择和评价数据结构的标准与方法是什么?【解答】首先,对给定的实际问题可以建立不同的数据结构;其次,对于给定的数据结构,可以选择不同的存储实现,即采用不同的存储结构;再次,在给定数据结构和存储结构的条件下,对同一基本操作可以设计出不同算法。因此,数据的逻辑结构、存储结构和操作(特别是基本操作)的实现这三者是密切相关的。一般地,在建立数据结构时应该考虑以下三个方面: 确定表示问题所需的数据及其特性; 确定必须支持的基本操作,并度量每种操作所受的时、空资源限制,某些重要的操作,例如查找、插入和删除的资源限制通常决定了数据结构的选择; 选择(或设计)最接近这些开销的数据结构。6. 算法设计(要求:用伪代码和C+描述两种方法描述算法,并分析时间复杂度) 对一个整型数组An设计一个排序算法。【解答】下面是简单选择排序算法的伪代码描述。 1. 对n个记录进行n-1趟简单选择排序: 1.1 在无序区i,n-1中选取最小记录,设其下标为index; 1.2 将最小记录与第i个记录交换; 下面是简单选择排序算法的C+描述。void SelectSort(int r , int n) for (i = 0; i < n - 1; i+) /对n个记录进行n-1趟简单选择排序 index = i; for (j = i + 1; j < n; j+) /在无序区中选取最小记录 if (rj < rindex) index = j; if (index != i) ririndex; /交换元素 简单选择排序算法SelectSort 分析算法,有两层嵌套的for循环,所以,。 找出整型数组An中元素的最大值和次最大值。【解答】算法的伪代码描述如下: 1. 将前两个元素进行比较,较大者放到max中,较小者放到nmax中; 2. 从第3个元素开始直到最后一个元素依次取元素Ai,执行下列操作: 2.1 如果Ai>max,则Ai为最大值,原来的最大值为次最大值;2.2 否则,如果Ai>nmax,则最大值不变,Ai为次最大值;3. 输出最大值max,次最大值nmax; 算法的C+描述如下:void Max_NextMax(int A , int n, int & max, int & nmax)if (A0 >= A1) max = A0; nmax = A1;else max = A1; nmax = A0; for (i = 2; i < n; i+) if (Ai >= max) nmax = max; max = Ai; else if (Ai > nmax) nmax = Ai; cout<<"最大值为:"<<max<<"n次最大值为:"<<nmax<<endl;最大值和次最大值算法Max_NextMax 分析算法,只有一层循环,共执行n-2次,所以,T(n)=O(n)。第 2 章 线性表2.1 本章导学1. 知识结构图 本章的知识结构如图2-1所示,其中第二层的椭圆代表本章的学习主线。线 性 表逻辑结构存储结构基本概念抽象数据类型定义线性表定义逻辑特征ADT定义基本操作顺序存储结构链接存储结构其他存储方法顺序表类定义基本操作的实现及时间性能单链表循环链表双链表比 较静态链表间接寻址图2-1 知识结构图2. 学习要点本章虽然讨论的是线性表,但涉及的许多问题都具有一定的普遍性,因此,本章是本课程的重点之一,也是其它后续章节的重要基础。对于本章的学习要从两条明线、一条暗线出发。两条明线是线性表的逻辑结构和存储结构,一条暗线是算法(即基本操作的实现)。注意线性表的ADT定义、顺序表类定义和单链表类定义三者之间的关系;注意在不同的存储结构下,相同操作的不同实现算法;注意对顺序表和链表从时间性能和空间性能等方面进行综合对比,在实际应用中能为线性表选择或设计合适的存储结构。2.2 习题解析1. 填空 在顺序表中,等概率情况下,插入和删除一个元素平均需移动( )个元素,具体移动元素的个数与( )和( )有关。【解答】表长的一半,表长,该元素在表中的位置 顺序表中第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的存储地址是( )。【解答】108【分析】第5个元素的存储地址=第1个元素的存储地址(51)×2=108 设单链表中指针p 指向结点A,若要删除A的后继结点(假设A存在后继结点),则需修改指针的操作为( )。【解答】p->next=(p->next)->next 单链表中设置头结点的作用是( )。【解答】为了运算方便【分析】例如在插入和删除操作时不必对表头的情况进行特殊处理。 非空的单循环链表由头指针head指示,则其尾结点(由指针p所指)满足( )。【解答】p->next=head【分析】如图2-8所示。heada1a2an p图2-8 尾结点p与头指针head的关系示意图 在由尾指针rear指示的单循环链表中,在表尾插入一个结点s的操作序列是( );删除开始结点的操作序列为( )。【解答】s->next =rear->next; rear->next =s; rear =s; q=rear->next->next; rear->next->next=q->next; delete q;【分析】操作示意图如图2-9所示:a1a2an rear sq图2-9 带尾指针的循环链表中插入和删除操作示意图rear 一个具有n个结点的单链表,在指针p所指结点后插入一个新结点的时间复杂度为( );在给定值为x的结点后插入一个新结点的时间复杂度为( )。【解答】(1),(n)【分析】在p所指结点后插入一个新结点只需修改指针,所以时间复杂度为(1);而在给定值为x的结点后插入一个新结点需要先查找值为x的结点,所以时间复杂度为(n)。 可由一个尾指针唯一确定的链表有( )、( )、( )。【解答】循环链表,循环双链表,双链表2. 选择题 线性表的顺序存储结构是一种( )的存储结构,线性表的链接存储结构是一种( )的存储结构。A 随机存取 B 顺序存取 C 索引存取 D 散列存取【解答】A,B【分析】参见2.2.1。 线性表采用链接存储时,其地址( )。A 必须是连续的 B 部分地址必须是连续的C 一定是不连续的 D 连续与否均可以【解答】D【分析】线性表的链接存储是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以连续,也可以不连续,甚至可以零散分布在内存中任意位置。 单循环链表的主要优点是( )。A 不再需要头指针了 B 从表中任一结点出发都能扫描到整个链表;C 已知某个结点的位置后,能够容易找到它的直接前趋;D 在进行插入、删除操作时,能更好地保证链表不断开。【解答】B 链表不具有的特点是( )。A 可随机访问任一元素 B 插入、删除不需要移动元素C 不必事先估计存储空间 D 所需空间与线性表长度成正比【解答】A 若某线性表中最常用的操作是取第i 个元素和找第i个元素的前趋,则采用( )存储方法最节省时间。A 顺序表 B 单链表 C 双链表 D 单循环链表【解答】A【分析】线性表中最常用的操作是取第i 个元素,所以,应选择随机存取结构即顺序表,同时在顺序表中查找第i个元素的前趋也很方便。单链表和单循环链表既不能实现随机存取,查找第i个元素的前趋也不方便,双链表虽然能快速查找第i个元素的前趋,但不能实现随机存取。 若链表中最常用的操作是在最后一个结点之后插入一个结点和删除第一个结点,则采用( )存储方法最节省时间。A 单链表 B 带头指针的单循环链表 C 双链表 D 带尾指针的单循环链表【解答】D【分析】在链表中的最后一个结点之后插入一个结点需要知道终端结点的地址,所以,单链表、带头指针的单循环链表、双链表都不合适,考虑在带尾指针的单循环链表中删除第一个结点,其时间性能是O(1),所以,答案是D 。 若链表中最常用的操作是在最后一个结点之后插入一个结点和删除最后一个结点,则采用( )存储方法最节省运算时间。A 单链表 B 循环双链表 C单循环链表 D 带尾指针的单循环链表【解答】B【分析】在链表中的最后一个结点之后插入一个结点需要知道终端结点的地址,所以,单链表、单循环链表都不合适,删除最后一个结点需要知道终端结点的前驱结点的地址,所以,带尾指针的单循环链表不合适,而循环双链表满足条件。 在具有n个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是( )。A O(1) B O(n) C O(n2) D O(nlog2n)【解答】B【分析】首先应顺序查找新结点在单链表中的位置。 对于n个元素组成的线性表,建立一个有序单链表的时间复杂度是( )。A O(1) B O(n) C O(n2) D O(nlog2n)【解答】C【分析】该算法需要将n个元素依次插入到有序单链表中,而插入每个元素需O(n)。 使用双链表存储线性表,其优点是可以( )。A 提高查找速度 B 更方便数据的插入和删除C 节约存储空间 D 很快回收存储空间【解答】B【分析】在链表中一般只能进行顺序查找,所以,双链表并不能提高查找速度,因为双链表中有两个指针域,显然不能节约存储空间,对于动态存储分配,回收存储空间的速度是一样的。由于双链表具有对称性,所以,其插入和删除操作更加方便。 在一个单链表中,已知q所指结点是p所指结点的直接前驱,若在q和p之间插入s所指结点,则执行( )操作。A s->next=p->next; p->next=s; B q->next=s; s->next=p; C p->next=s->next; s->next=p; D p->next=s; s->next=q;【解答】B【分析】注意此题是在q和p之间插入新结点,所以,不用考虑修改指针的顺序。 在循环双链表的p所指结点后插入s所指结点的操作是( )。A p->next=s; s->prior=p; p->next->prior=s; s->next=p->next; B p->next=s; p->next->prior=s; s->prior=p; s->next=p->next;C s->prior=p; s->next=p->next; p->next=s; p->next->prior=s;D s->prior=p; s->next=p->next; p->next->prior=s; p->next=s【解答】D【分析】在链表中,对指针的修改必须保持线性表的逻辑关系,否则,将违背线性表的逻辑特征,图2-10给出备选答案C和D的图解。(a) 备选答案C操作示意图(第4步指针修改无法进行) (b) 备选答案D操作示意图 图2-10 双链表插入操作修改指针操作示意图sai-1aixpsai-1aixp(13)用数组r存储静态链表,结点的next域指向后继,工作指针j指向链中某结点,则j后移的操作语句为( )。A j = rj.next B j = j + 1 C j = j->next D j = rj-> next【解答】A【分析】注意next是数组下标,因此排除C和D,对于备选答案B,假设工作指针j指向某结点p,则j+1不一定指向结点p的后继结点。(14)设线性表有n个元素,以下操作中,( )在顺序表上实现比在链表上实现的效率更高。A 输出第i(1in)个元素值 B 交换第1个和第2个元素的值C 顺序输出所有n个元素 D 查找与给定值x相等的元素在线性表中的序号【解答】A【分析】在顺序表上输出第i(1in)个元素值需要O(1)时间,在链表上输出第i(1in)个元素值需要O(n)时间;在顺序表上和链表上交换第1个和第2个元素的值都需要O(1)时间;在顺序表上和链表上顺序输出所有n个元素都需要O(n)时间;在顺序表上和链表上查找与给定值x相等的元素都需要进行顺序查找,需要O(n)时间。3. 判断题 线性表的逻辑顺序和存储顺序总是一致的。【解答】错。顺序表的逻辑顺序和存储顺序一致,链表的逻辑顺序和存储顺序不一定一致。 线性表的顺序存储结构优于链接存储结构。【解答】错。两种存储结构各有优缺点。 设p,q是指针,若p=q,则*p=*q。【解答】错。p=q只能表示p和q指向同一起始地址,而所指类型则不一定相同。 线性结构的基本特征是:每个元素有且仅有一个直接前驱和一个直接后继。【解答】错。每个元素最多只有一个直接前驱和一个直接后继,第一个元素没有前驱,最后一个元素没有后继。 在单链表中,要取得某个元素,只要知道该元素所在结点的地址即可,因此单链表是随机存取结构。【解答】错。要找到该结点的地址,必须从头指针开始查找,所以单链表是顺序存取结构。4请说明顺序表和单链表各有何优缺点,并分析下列情况下,采用何种存储结构更好些。 若线性表的总长度基本稳定,且很少进行插入和删除操作,但要求以最快的速度存取线性表中的元素。 如果n个线性表同时并存,并且在处理过程中各表的长度会动态发生变化。 描述一个城市的设计和规划。【解答】顺序表的优点: 无需为表示表中元素之间的逻辑关系而增加额外的存储空间; 可以快速地存取表中任一位置的元素(即随机存取)。顺序表的缺点: 插入和删除操作需移动大量元素; 表的容量难以确定; 造成存储空间的“碎片”。单链表的优点: 不必事先知道线性表的长度; 插入和删除元素时只需修改指针,不用移动元素。单链表的缺点: 指针的结构性开销; 存取表中任意元素不方便,只能进行顺序存取。 应选用顺序存储结构。因为顺序表是随机存取结构,单链表是顺序存取结构。本题很少进行插入和删除操作,所以空间变化不大,且需要快速存取,所以应选用顺序存储结构。 应选用链接存储结构。链表容易实现表容量的扩充,适合表的长度动态发生变化。 应选用链接存储结构。因为一个城市的设计和规划涉及活动很多,需要经常修改、扩充和删除各种信息,才能适应不断发展的需要。而顺序表的插入、删除的效率低,故不合适。5算法设计 设计一个时间复杂度为(n)的算法,实现将数组An中所有元素循环左移k个位置。【解答】算法思想请参见主教材第一章思想火花。下面给出具体算法。void Converse(int A , int n, int k) Reverse(A, 0, k-1); Reverse(A, k, n-1); Reverse(A, 0, n-1);void Reverse(int A , int from, int to) /将数组A中元素从from到to逆置 for (i = 0; i < (to from + 1)/2; i+)Afrom + iAto - i; /交换元素 循环左移算法Converse 分析算法,第一次调用Reverse函数的时间复杂度为O(k),第二次调用Reverse函数的时间复杂度为O(n-k),第三次调用Reverse函数的时间复杂度为O(n),所以,总的时间复杂度为O(n)。 已知数组An中的元素为整型,设计算法将其调整为左右两部分,左边所有元素为奇数,右边所有元素为偶数,并要求算法的时间复杂度为(n)。【解答】从数组的两端向中间比较,设置两个变量i和j,初始时i=0,j=n-1,若Ai为偶数并且Aj为奇数,则将Ai与Aj交换。具体算法如下: void Adjust(int A , n) i = 0; j = n - 1; while (i < j) while (Ai % 2 != 0) i+; while (Aj % 2 = 0) j- if (i < j) AiAj; 数组奇偶调整算法Adjust 分析算法,两层循环将数组扫描一遍,所以,时间复杂度为(n)。 试编写在无头结点的单链表上实现线性表的插入操作的算法,并和带头结点的单链表上的插入操作的实现进行比较。【解答】参见2.2.3。 试分别以顺序表和单链表作存储结构,各写一实现线性表就地逆置的算法。【解答】顺序表的逆置,即是将对称元素交换,设顺序表的长度为length,则将表中第i个元素与第length-i-1个元素相交换。具体算法如下: template <class T> void Reverse(T data , int length) for (i = 0; i <= length/2; i+) temp = datai; datai = datalength i - 1; datalength i - 1 = temp;顺序表逆置算法Reverse单链表的逆置请参见2.2.4算法2-4和算法2-6。 假设在长度大于1的循环链表中,即无头结点也无头指针,s为指向链表中某个结点的指针,试编写算法删除结点s的前趋结点。【解答】利用单循环链表的特点,通过指针s可找到其前驱结点r以及r的前驱结点p,然后将结点r删除,如图2-11所示,具体算法如下:template <class T>void Del(Node<T> *s) p = s; /工作指针p初始化,查找s的前驱结点的前驱结点,用p指示 while (p->next->next != s) p = p->next; r = p->next; /r为p的前驱结点,q为r的前驱结点 p->next = s; /删除r所指结点 delete r; 循环链表删除算法Dela1a2an 图2-11 删除结点s的前驱结点操作示意图a3a4spr 已知一单链表中的数据元素含有三类字符:字母、数字和其他字符。试编写算法,构造三个循环链表,使每个循环链表中只含同一类字符。【解答】在单链表A中依次取元素,若取出的元素是字母,把它插入到字母链表B 中,若取出的元素是数字,则把它插入到数字链表D中,直到链表的尾部,这样表B,D,A中分别存放字母、数字和其他字符。具体算法如下:template <class T>void Adjust(Node<T> *A, Node<int> *D, Node<char> *B) D = new Node<int> D->next = D; /创建空循环链表D,存放数字 B = new Node<char> B->next = B; /创建空循环链表B,存放字符

    注意事项

    本文(数据结构c++版课后习题解析(84页).doc)为本站会员(1595****071)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开