ImageVerifierCode 换一换
格式:DOCX , 页数:84 ,大小:701.48KB ,
资源ID:9286457      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9286457.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构课程课后习题答案分解.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构课程课后习题答案分解.docx

1、数据结构课程课后习题答案分解数据结构简明教程练习题及参考答案练习题11.单项选择题(1)线性结构中数据元素之间是( )关系。A.一对多 B.多对多 C.多对一 D. 一对一答:D(2)数据结构中与所使用的计算机无关的是数据的( )结构。C求解问题的有限运算序列 D.调度方法A.存储 B.物理答:C(3) 算法分析的目的是(A.找出数据结构的合理性C.分析算法的效率以求改进 答:C(4) 算法分析的两个主要方面是(A.空间复杂性和时间复杂性C.可读性和文档性答:A(5) 计算机算法指的是()。A.计算方法 B.排序方法答:CB.研究算法中的输入和输出的关系D.分析算法的易懂性和文档性)。B.正确

2、性和简明性D.数据复杂性和程序复杂性(6)计算机算法必须具备输入、输出和( )等5个特性。2.填空题(1) 数据结构包括数据的 、数据的 和数据的 这三个方面的内容。 答:逻辑结构存储结构运算(2) 数据结构按逻辑结构可分为两大类,它们分别是 和。 答:线性结构非线性结构(3) 数据结构被形式地定义为 (D,R),其中D是 的有限集合,R是D上的 有 限集合。答:数据元素关系(4 )在线性结构中,第一个结点 前驱结点,其余每个结点有且只有 1个前驱结点; 最后一个结点 后继结点,其余每个结点有且只有 1个后继结点。答:没有没有(5) 在树形结构中,树根结点没有 结点,其余每个结点有且只有 个前

3、驱结点;叶子结点没有 结点,其余每个结点的后继结点数可以是 。答:前驱1后继任意多个(6)在图形结构中,每个结点的前驱结点数和后继结点数可以是( )。答:任意多个(7) 数据的存储结构主要有四种,它们分别是 、和存储结构。 答:顺序链式索引哈希(8 )一个算法的效率可分为 效率和 效率。答:时间空间3.简答题(1)数据结构和数据类型两个概念之间有区别吗?答:简单地说,数据结构定义了一组按某些关系结合在一起的数组元素的集合。数据 类型不仅定义了一组数据元素,而且还在其上定义了一组操作。(2)简述线性结构、树形结构和图形结构的不同点。答:线性结构反映结点间的逻辑关系是一对一的,树形线性结构反映结点

4、间的逻辑关 系是一对多的,图在结构反映结点间的逻辑关系是多对多的。(3 )设有采用二元组表示的数据逻辑结构S=(D,R),其中D= a,b,, R=(a,b),(a,c),(c,d),(c,f),(f,h),(d,e),(f,g),(h,i),问相对于关系 R,哪些结点是开始结点,哪些 结点是终端结点?答:该逻辑结构为树形结构,其中 a结点没有前驱结点,称为根结点, b、e、g、i结点没有后继结点,是终端结点,也称为叶子结点。(4) 以下各函数是算法中语句的执行频度, n为问题规模,给出对应的时间复杂度:T 1( n)=n Iog2 n- 1000log2 nT2( n)= nlog23 -

5、1000log 2n2T3(n)=n - 1000log 2nT 4( n)=2 nlog2 n- 1000log2n答:T 1(n)=0(nlog2n), T2(n)=0( nlog23), T3(n)=0(n2), T4(n)=0( nlog2n)。(5)分析下面程序段中循环语句的执行次数。int j=0,s=0,n=100;do j=j+1;s=s+10*j; while (jn & sn);答:j=0,第1次循环:j=1 , s=10。第2次循环:j=2, s=30。第3次循环:j=3, s=60。第4次循环:j=4, s=100。while条件不再满足。所以,其中循环语句的执行次数为

6、 4。(6) 执行下面的语句时,语句 S+的执行次数为多少?int s=0;for (i=1;i=i;j-)s+;答:语句 s 的执行次数 a I-、 (n - i T) = n (n -1)亠-亠3 = (n 3)(n -2)。i j zn i 4 2(7)设n为问题规模,求以下算法的时间复杂度。void fun1(int n) int x=0,i;for (i=1;i=n;i+)for (j=i+1;j=n;j+)x+;n n n答:其中x+语句属基本运算语句, T(n) = 7 1=7 (n _“ = n(n1)=0(n2)。i 土 j 十 i 土 2(8) 设n为问题规模,是一个正偶数

7、,试计算以下算法结束时 m的值,并给出该算 法的时间复杂度。void fun2(int n) int m=0;for (i=1;i=n;i+)for (j=2*i;j=n;j+)m+;n/ 2 n n/ 2答:由于内循环j的取值范围,所以iw n/2,则m二* *二 (n - (2i-1)二n?/4,该程i J j =2i i d序段的时间复杂度为 O( n2)。上机实验题1有一个整型数组a,其中含有n个元素,设计尽可能好的算法求其中的最大元素和次大 元素,并采用相关数据测试。解:maxs算法用于返回数组 a0.n-1中的最大元素值 max1和次大元素值 max2, max1和 max2设计为

8、引用类型。对应的程序如下:#include void maxs(int a,int n,int &max1,int &max2) int i;max1=max2=a0;for (i=1;imax1) max2=max1; max1=ai;else if (aimax2) max2=ai;void main() int a=1,4,10,6,8,3,5,7,9,2;int n=10;int max1,max2;maxs(a,n,max1,max2);printf( 最大元素值 =%d, 次大元素值 =%dn,max1,max2);练习题 21.单项选择题( 1)数据在计算机存储器内表示时, 物理

9、地址与逻辑地址相对顺序相同并且是连续的, 称之为( )。A.存储结构 B.逻辑结构 C.顺序存储结构 D.链式存储结构答:C(2)在n个结点的顺序表中,算法的时间复杂度是 0 (1)的操作是()。A.访问第i个结点(K i n)和求第i (2 i n)个结点的前驱结点B.在第i ( K i w n)个结点后插入一个新结点C.删除第i个结点(1w i w n)D.将 n 个结点从小到大排序答: A( 3) 向一个有 127 个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要 移动( )个元素。A.8 B.63.5 C.63 D.7答: B(4)链式存储结构所占存储空间( )。A.分两部分,

10、一部分存放结点值,另一部分存放表示结点间关系的指针B.只有一部分,存放结点值C.只有一部分,存储表示结点间关系的指针D.分两部分,一部分存放结点值,另一部分存放结点所占单元数答: A( 5)线性表若采用链式存储结构时,要求内存中可用存储单元的地址( )。2.填空题(1) 在顺序表中插入或删除一个元素时,需要平均移动( )元素,具体移动的元 素个数与()有关。答:表中一半 表长和该元素在表中的位置(2) 向一个长度为n的顺序表的第i个元素(K i n+1)之前插入一个元素时,需向 后移动()个元素。答:n-i+1(3) 向一个长度为n的顺序表中删除第i个元素(K i1)个结点的循环双向链表中,为

11、空的指针域数为( )。答:03.简答题(1)试比较顺序存储结构和链式存储结构的优缺点。在什么情况下用顺序表比链表好?答:顺序存储结构中,相邻数据元素的存放地址也相邻,并要求内存中可用存储单元 的地址必须是连续的。其优点是存储密度大,存储空间利用率高;缺点是插入或删除元素 时不方便。链式存储结构中,相邻数据元素可随意存放,但所占存储空间分两部分,一部分存放 结点值,另一部分存放表示结点间关系的指针。其优点是插入或删除元素时很方便,使用 灵活;缺点是存储密度小,存储空间利用率低。顺序表适宜于做查找这样的静态操作;链表宜于做插入、删除这样的动态操作。若线 性表的长度变化不大,且其主要操作是查找,则采

12、用顺序表;若线性表的长度变化较大, 且其主要操作是插入、删除操作,则采用链表。(2)对于表长为n的顺序表,在任何位置上插入或删除一个元素的概率相等时,插入 一个元素所需要移动的元素的平均个数为多少?删除一个元素所需要移动的平均个数为多 少?答: 插入一个元素所需要移动的元素的平均个数为 (n- 1)/2,删除一个元素所需要移动的平均个数为 n/2。( 3)在链表中设置头结点的作用是什么?答: 在链表中设置头结点后,不管链表是否为空表,头结点指针均不空,并使得对链 表的操作(如插入和删除)在各种情况下统一,从而简化了算法的实现过程。( 4)对于双链表和单链表, 在两个结点之间插入一个新结点时需修

13、改的指针各为多少 个?答:对于双链表,在两个结点之间插入一个新结点时,需修改前驱结点的 next域、后继结点的prior域和新插入结点的next、prior域。所以共修改4个指针。对于单链表,在两个结点之间插入一个新结点时,需修改前一结点的 n ext域,新插入结点的next域。所以共修改两个指针。(5)某含有n (n1)结点的线性表中,最常用的操作是在尾结点之后插入一个结点和 删除第一个结点,则采用以下哪种存储方式最节省运算时间。1单链表;2仅有头指针不带头结点的循环单链表;3双链表;4仅有尾指针的循环单链表。答:在单链表中,删除第一个结点的时间复杂度为 0(1)。插入结点需找到前驱结点,所

14、以在尾结点之后插入一个结点,需找到尾结点,对应的时间复杂度为 O(n)。在仅有头指针不带头结点的循环单链表中,删除第一个结点的时间复杂度 0( n),因为删除第一个结点后还要将其改为循环单链表;在尾结点之后插入一个结点的时间复杂度也 为 0( n)。在双链表中,删除第一个结点的时间复杂度为 0(1);在尾结点之后插入一个结点,也需找到尾结点,对应的时间复杂度为 0(n)。在仅有尾指针的循环单链表中,通过该尾指针可以直接找到第一个结点,所以删除第 一个结点的时间复杂度为 0(1);在尾结点之后插入一个结点也就是在尾指针所指结点之后 插入一个结点,时间复杂度也为 0(1)。因此最节省运算时间。4.

15、算法设计题(1)设计一个高效算法,将顺序表的所有元素逆置,要求算法空间复杂度为 0(1)。解:遍历顺序表L的前半部分元素,对于元素 L.datai( 0 i v Length/2 ),将其与后 半部分对应元素 L.dataL.le ngth-i-1进行交换。对应的算法如下:void reverse( SqList &L) int i;ElemType x;for (i=0;iL.length/2;i+) x=L.datai; /L.datai 与 L.dataL.length-i-1 交换L.datai=L.dataL.length-i-1;L.dataL.length-i-1=x;本算法的时

16、间复杂度为 O( n)。(2 )设计一个算法从顺序表中删除重复的元素, 并使剩余元素间的相对次序保持不变。解:对于顺序表L,用i从1开始遍历其元素,设 L.data0.j (j的初值为0)中没有重复的元素。检测 L.datai (jiL.length ),若L.data i和L.data0.j中任何一个元素都不相 同,则将L.datai存入L.dataj+1中。对应的算法如下:void delsame( SqList &L) /L 为引用型参数 int i,j=O,k;for (i=1;iL .l ength;i+) k=0;while (kj) /表示L.datai 和L.data0.j 中

17、所有元素都不相同 j+;L.dataj=L.datai;L.length=j+1; /顺序表长度置新值本算法的时间复杂度为 O(n2),空间复杂度为0(1)。(3)设计一个算法从有序顺序表中删除重复的元素, 并使剩余元素间的相对次序保持不变。解:在有序顺序表L中,所有重复的元素应是相邻存放的,用 k保存不重复出现的元素个数,先将不重复的有序区看成是 L.data0.0,置e=L.data0,用i从1开始遍历L的所有元素:当 L.datai丰e时,将它放在 L.datak中,k增1,置e=L.data i,最后将 L的 length置为k。对应的算法如下:void delsame1( SqLis

18、t &L) /L 为引用型参数 int i,k=1; /k保存不重复的元素个数ElemType e;return 1;(6)有一个整数元素建立的单链表 使得A单链表中含有所有的偶数结点, 序。解:采用重新单链表的方法,由于要保持相对次序,所以采用尾插法建立新表 用p遍历原单链表A的所有数据结点,若为偶数结点,将其链到 其链到B中。对应的算法如下:void Split( SLink *&A,SLink *&B) SLink *p=A-next,*ra,*rb;/建立头结点r总是指向B链表的尾结点/偶数结点/将*p结点链到A中/奇数结点/将*p结点链到B中ra=A;B=(SLink *)mallo

19、c(sizeof(SLink);rb=B;while (p!=NULL) if (p-data%2=0) ra-next=p;ra=p; p=p-next;else rb-next=p;rb=p;p=p-next;ra-next=rb-next=NULL;本算法的时间复杂度为 0( n),空间复杂度为 0(1)。(7)有一个有序单链表(从小到大排列),表头指针为 L,设计一个算法向该单链表中插入一个元素为x的结点,使插入后该链表仍然有序。解:先建立一个待插入的结点,然后依次与链表中的各结点的数据域比较大小,找到 插入该结点的位置,最后插入该结点。对应的算法如下:void inorderList

20、( SLink *&L,ElemType x) SLink *s,*p,*q;s=(SLink *)malloc(sizeof(SLink); / 建立一个待插入的结点/若单链表为空或x小于第1个结点date域/把*s结点插入到头结点之后/寻找插入位置,p指向待比较的结点,q指向p的前驱结点s-data=x;s-next=NULL; if (L=NULL | xdata) s-next=L;L=s;else q=L;p=q-next;while (p!=NULL & xp-data) / 若x小于 p所指结点的 data 域值if (xp-data) q=p;p=p-next;s-next=p

21、; /将s结点插入到*q和*p之间q-next=s;(8)有一个单链表L,其中可能出现值域重复的结点,设计一个算法删除值域重复的 结点。并分析算法的时间复杂度。解:用p遍历单链表,用r遍历*p结点之后的结点,q始终指向*r结点的直接前驱结 点,若 r- data=p- data ,则删除 *r 结点,否则 q、r 同步后移一个结点。对应的算法如下: void dels1( SLink *&L) SLink *p=L-next,*q,*r,*t;while (p!=NULL) q=p;r=q-next;while (r!=NULL) if (r-data=p-data) /r 指向被删结点 t=

22、r-next;q-next=t;free(r);r=t;else q=r;r=r-next;p=p-next;本算法的时间复杂度为 O(n2)。( 9)有一个递增有序单链表(允许出现值域重复的结点) ,设计一个算法删除值域重复的结点。并分析算法的时间复杂度。解: 由于是有序表,所以相同值域的结点都是相邻的。用 p 遍历递增单链表,若 *p 结点的值域等于其后结点的值域,则删除后者。对应的算法如下:void dels( SLink *&L) SLink *p=L-next,*q;while (p-next!=NULL) if (p-data=p-next-data) / 找到重复值的结点 q=p

23、_next; p_next=q_next; free(q);else p=p-next;本算法的时间复杂度为 0(n)。q指向这个重复值的结点/删除*q结点(10)有一个双链表 L,设计一个算法查找第一个元素值为 x的结点,将其与后继结点进行交换。解:先找到第一个元素值为 x的结点*p,q指向其后继结点,本题是将 *p结点移到*q 结点之后,实现过程是:删除 *p结点,再将其插入到*q结点之后。对应的算法如下:int swap( DLink *L,ElemType x) DLink *p=L-next,*q;while (p!=NULL & p-data!=x) p=p-next;if (p=

24、NULL)return 0;else q=p-next;if (q!=NULL) p-prior-next=q; q_prior=p_prior; p-next=q-next;if (q-next!=NULL) q-next-prior=p;q-next=p;p-prior=q; return 1;elsereturn 0;/未找到值为x的结点/找到值为x的结点*p/q指向*p的后继结点*p结点不是尾结点/先删除*p结点II将*p结点插入到*q结点之后*p结点是尾结点II无法与后继结点交换,返回 0(11)对于有n (n1)个数据结点的循环单链表 L,设计一个算法将所有结点逆置。解:采用头插法

25、重建循环单链表 L的思路,先建立一个空的循环单链表,用 p遍历所有数据结点,每次将*p结点插入到前端。对应的算法如下:void Reverse( SLink *&L) SLink *p=L-next,*q;/ 建立一个空循环单链表/ 将 *p 结点插入到前端L-next=L;while (p!=L) q=p-next; p-next=L-next; L-next=p;p=q;上机实验题 2有两个整数集合采用有序单链表存储,设计尽可能高效的算法求两个集合的并集、交 集和差集。并用相关数据进行测试。#include #include SLink.hvoid Union( SLink *L1, SL

26、ink *L2, SLink *&L3) / 求并集 SLink *p,*q,*s,*tc;L3=(SLink *)malloc(sizeof(SLink);tc=L3;p=L1-next;q=L2-next;while (p!=NULL & q!=NULL) if (p-datadata) s=(SLink *)malloc(sizeof(SLink);s-data=p-data;tc-next=s;tc=s;p=p-next;else if (p-dataq-data) s=(SLink *)malloc(sizeof(SLink);s-data=q-data;tc-next=s;tc=s

27、;q=q-next;else s=(SLink *)malloc(sizeof(SLink);s-data=p-data;tc-next=s;tc=s;p=p_next;q=q_next;while (p!=NULL) s=(SLink *)malloc(sizeof(SLink);s-data=p-data;tc-next=s;tc=s;p=p-next;while (q!=NULL) s=(SLink *)malloc(sizeof(SLink);s-data=q-data;tc-next=s;tc=s;q=q-next;tc-next=NULL;void lnterSection(SLink *L1,SLink *L2,SLink *&L3) / 求交集 SLink *p,*q,*s,*tc;L3=(SLink *)malloc(sizeof(SLink);tc=L3;p=L1-next;q=L2-next;while (p!=NULL & q!=NULL) if (p_datadata)p=p-next;else if (p-dataq-data)q=q-next;else p-data=q-data s=(SLink *)malloc(sizeof(SLink);s-data=p-data;tc-next=s;tc=s

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1