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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

数据结构课程课后习题答案Word文档格式.docx

1、(1)数据结构和数据类型两个概念之间有区别吗?简单地说,数据结构定义了一组按某些关系结合在一起的数组元素的集合。数据类型不仅定义了一组数据元素,而且还在其上定义了一组操作。(2)简述线性结构、树形结构和图形结构的不同点。线性结构反映结点间的逻辑关系是一对一的,树形线性结构反映结点间的逻辑关系是一对多的,图在结构反映结点间的逻辑关系是多对多的。(3)设有采用二元组表示的数据逻辑结构S=(D,R),其中D=a,b,i,R=(a,b),(a,c),(c,d),(c,f),(f,h),(d,e),(f,g),(h,i),问相对于关系R,哪些结点是开始结点,哪些结点是终端结点?该逻辑结构为树形结构,其中

2、a结点没有前驱结点,称为根结点,b、e、g、i结点没有后继结点,是终端结点,也称为叶子结点。(4)以下各函数是算法中语句的执行频度,n为问题规模,给出对应的时间复杂度:T1(n)=nlog2n-1000log2nT2(n)= -1000log2nT3(n)=n2-1000log2nT4(n)=2nlog2n-1000log2nT1(n)=O(nlog2n),T2(n)=O( ),T3(n)=O(n2),T4(n)=O(nlog2n)。(5)分析下面程序段中循环语句的执行次数。int j=0,s=0,n=100;do j=j+1; s=s+10*j; while (jn & sn);j=0,第1

3、次循环:j=1,s=10。第2次循环:j=2,s=30。第3次循环:j=3,s=60。第4次循环:j=4,s=100。while条件不再满足。所以,其中循环语句的执行次数为4。(6)执行下面的语句时,语句s+的执行次数为多少?int s=0;for (i=1;i=i;j-) s+;语句s的执行次数。(7)设n为问题规模,求以下算法的时间复杂度。void fun1(int n) int x=0,i; for (i=1;=n; for (j=i+1;jj+) x+;其中x+语句属基本运算语句, =O(n2)。(8)设n为问题规模,是一个正偶数,试计算以下算法结束时m的值,并给出该算法的时间复杂度。

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

5、 max1=ai; else if (ai 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);练习题2(1)数据在计算机存储器内表示时,物理地址与逻辑地址相对顺序相同并且是连续的,称之为( )。A.存储结构 B.逻辑结构 C.顺序存储结构 D.链式存储结构(2)在n个结点的顺序表中,算法的时间复杂度是O(1)的操作是( )。A.访问第i个结点(1in)和求第i(2in)个结点的前驱结点

6、B.在第i(1in)个结点后插入一个新结点C.删除第i个结点(1in)D.将n个结点从小到大排序(3) 向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动( )个元素。A.8 B.63.5 C.63 D.7(4)链式存储结构所占存储空间( )。A.分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针B.只有一部分,存放结点值C.只有一部分,存储表示结点间关系的指针D.分两部分,一部分存放结点值,另一部分存放结点所占单元数(5)线性表若采用链式存储结构时,要求内存中可用存储单元的地址( )。A.必须是连续的 B.部分地址必须是连续的C.一定是不连续的 D.连续或不

7、连续都可以(6)一个线性表在( )情况下适用于采用链式存储结构。A.需经常修改其中的结点值 B.需不断对其进行删除插入C.其中含有大量的结点 D.其中结点结构复杂(7)单链表的存储密度( )A.大于1 B.等于1 C.小于1 D.不能确定(1)在顺序表中插入或删除一个元素时,需要平均移动( )元素,具体移动的元素个数与( )有关。表中一半 表长和该元素在表中的位置(2)向一个长度为n的顺序表的第i个元素(1in+1)之前插入一个元素时,需向后移动( )个元素。n-i+1(3)向一个长度为n的顺序表中删除第i个元素(1in)时,需向前移动( )个元素。n-i(4)在顺序表中访问任意一个元素的时间

8、复杂度均为( ),因此顺序表也称为( )的数据结构。O(1) 随机存取(5)顺序表中逻辑上相邻的元素的物理位置( )相邻。单链表中逻辑上相邻的元素的物理位置( )相邻。一定 不一定(6)在带头结点的单链表中,除头结点外,任一结点的存储位置由( )指示。其前驱结点的链域的值(7)在含有n个数据结点的单链表中要删除已知结点*p,需找到它的( ),其时间复杂度为( )。前驱结点的地址 O(n)(8)含有n(n1)个结点的循环双向链表中,为空的指针域数为( )。(1)试比较顺序存储结构和链式存储结构的优缺点。在什么情况下用顺序表比链表好?顺序存储结构中,相邻数据元素的存放地址也相邻,并要求内存中可用存

9、储单元的地址必须是连续的。其优点是存储密度大,存储空间利用率高;缺点是插入或删除元素时不方便。链式存储结构中,相邻数据元素可随意存放,但所占存储空间分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针。其优点是插入或删除元素时很方便,使用灵活;缺点是存储密度小,存储空间利用率低。顺序表适宜于做查找这样的静态操作;链表宜于做插入、删除这样的动态操作。若线性表的长度变化不大,且其主要操作是查找,则采用顺序表;若线性表的长度变化较大,且其主要操作是插入、删除操作,则采用链表。(2)对于表长为n的顺序表,在任何位置上插入或删除一个元素的概率相等时,插入一个元素所需要移动的元素的平均个数为多少?

10、删除一个元素所需要移动的平均个数为多少?插入一个元素所需要移动的元素的平均个数为(n-1)/2,删除一个元素所需要移动的平均个数为n/2。(3)在链表中设置头结点的作用是什么?在链表中设置头结点后,不管链表是否为空表,头结点指针均不空,并使得对链表的操作(如插入和删除)在各种情况下统一,从而简化了算法的实现过程。(4)对于双链表和单链表,在两个结点之间插入一个新结点时需修改的指针各为多少个?对于双链表,在两个结点之间插入一个新结点时,需修改前驱结点的next域、后继结点的prior域和新插入结点的next、prior域。所以共修改4个指针。对于单链表,在两个结点之间插入一个新结点时,需修改前一

11、结点的next域,新插入结点的next域。所以共修改两个指针。(5)某含有n(n1)结点的线性表中,最常用的操作是在尾结点之后插入一个结点和删除第一个结点,则采用以下哪种存储方式最节省运算时间。单链表;仅有头指针不带头结点的循环单链表;双链表;仅有尾指针的循环单链表。在单链表中,删除第一个结点的时间复杂度为O(1)。插入结点需找到前驱结点,所以在尾结点之后插入一个结点,需找到尾结点,对应的时间复杂度为O(n)。在仅有头指针不带头结点的循环单链表中,删除第一个结点的时间复杂度O(n),因为删除第一个结点后还要将其改为循环单链表;在尾结点之后插入一个结点的时间复杂度也为O(n)。在双链表中,删除第

12、一个结点的时间复杂度为O(1);在尾结点之后插入一个结点,也需找到尾结点,对应的时间复杂度为O(n)。在仅有尾指针的循环单链表中,通过该尾指针可以直接找到第一个结点,所以删除第一个结点的时间复杂度为O(1);在尾结点之后插入一个结点也就是在尾指针所指结点之后插入一个结点,时间复杂度也为O(1)。因此最节省运算时间。4. 算法设计题(1)设计一个高效算法,将顺序表的所有元素逆置,要求算法空间复杂度为O(1)。遍历顺序表L的前半部分元素,对于元素L.datai(0iL.length/2),将其与后半部分对应元素L.dataL.length-i-1进行交换。对应的算法如下:void reverse(

13、SqList &L) ElemType x; for (i=0;L.length/2; x=L.datai; /L.datai与L.dataL.length-i-1交换 L.datai=L.dataL.length-i-1; L.dataL.length-i-1=x; 本算法的时间复杂度为O(n)。(2)设计一个算法从顺序表中删除重复的元素,并使剩余元素间的相对次序保持不变。对于顺序表L,用i从1开始遍历其元素,设L.data0.j(j的初值为0)中没有重复的元素。检测L.datai(jL.length),若L.datai和L.data0.j中任何一个元素都不相同,则将L.datai存入L.d

14、ataj+1中。void delsame(SqList &L) /L为引用型参数 int i,j=0,k;L.length; k=0; while (kj) /表示L.datai和L.data0.j中所有元素都不相同 j+; L.dataj=L.datai; L.length=j+1; /顺序表长度置新值本算法的时间复杂度为O(n2),空间复杂度为O(1)。(3)设计一个算法从有序顺序表中删除重复的元素,并使剩余元素间的相对次序保持不变。在有序顺序表L中,所有重复的元素应是相邻存放的,用k保存不重复出现的元素个数,先将不重复的有序区看成是L.data0.0,置e=L.data0,用i从1开始遍

15、历L的所有元素:当L.dataie时,将它放在L.datak中,k增1,置e=L.datai,最后将L的length置为k。void delsame1(SqList & int i,k=1; /k保存不重复的元素个数 ElemType e; e=L.data0; if (L.datai!=e) /只保存不重复的元素 L.datak=L.datai; e=L.datai; L.length=k; /顺序表长度置新值本算法是一个高效算法,其时间复杂度为O(n),空间复杂度为O(1)。如果每次遇到重复的元素,都通过移动其后所有元素来删除它,这样的时间复杂度会变成O(n2)。(4)设计一个算法删除单链

16、表L中第一个值为x的结点。用p、q遍历整个单链表,p指向*q的前驱结点,q用于查找第一个值为x的结点,当找到后将*q结点删除,返回1;否则返回0。int delx(SLink *&L,ElemType x) SLink *p=L,*q=p-next; /p指向*q的前驱结点 while (q!=NULL & q-data!=x) p=q; q=q- if (q!=NULL) /找到值为x的结点 p-next=q- free(q); return 1; else return 0; /未找到值为x的结点(5)设计一个算法判定单链表L是否是递增的。判定链表L从第2个结点开始的每个结点的值是否比其前

17、驱的值大。若有一个不成立,则整个链表便不是递增的;否则是递增的。int increase(SLink *L) SLink *pre=L-next,*p; /pre指向第一个数据结点 p=pre- /p指向*pre结点的后继结点 while (p!=NULL) if (p-data=pre-data) /若正序则继续判断下一个结点 pre=p; /pre、p同步后移 p=p- else return 0; return 1;(6)有一个整数元素建立的单链表A,设计一个算法,将其拆分成两个单链表A和B,使得A单链表中含有所有的偶数结点,B单链表中所有的奇数结点,且保持原来的相对次序。采用重新单链表

18、的方法,由于要保持相对次序,所以采用尾插法建立新表A、B。用p遍历原单链表A的所有数据结点,若为偶数结点,将其链到A中,若为奇数结点,将其链到B中。void Split(SLink *&A,SLink *&B) SLink *p=A-next,*ra,*rb; ra=A; B=(SLink *)malloc(sizeof(SLink); /建立头结点 rb=B; /r总是指向B链表的尾结点data%2=0) /偶数结点 ra-next=p; /将*p结点链到A中 ra=p; else /奇数结点 rb- /将*p结点链到B中 rb=p; ra-next=rb-next=NULL;本算法的时间复

19、杂度为O(n),空间复杂度为O(1)。(7)有一个有序单链表(从小到大排列),表头指针为L,设计一个算法向该单链表中插入一个元素为x的结点,使插入后该链表仍然有序。先建立一个待插入的结点,然后依次与链表中的各结点的数据域比较大小,找到插入该结点的位置,最后插入该结点。void inorderList(SLink *& SLink *s,*p,*q; s=(SLink *)malloc(sizeof(SLink); /建立一个待插入的结点 s-data=x;s- if (L=NULL | xdata) /若单链表为空或x小于第1个结点date域 s-next=L; /把*s结点插入到头结点之后

20、L=s; else q=L; /寻找插入位置,p指向待比较的结点,q指向p的前驱结点 p=q- while (p! xp-data) /若x小于p所指结点的data域值 if (xdata) q=p; p=p- s- /将s结点插入到*q和*p之间 q-next=s;(8)有一个单链表L,其中可能出现值域重复的结点,设计一个算法删除值域重复的结点。并分析算法的时间复杂度。用p遍历单链表,用r遍历*p结点之后的结点,q始终指向*r结点的直接前驱结点,若r-data=p-data,则删除*r结点,否则q、r同步后移一个结点。void dels1(SLink *& SLink *p=L-next,*

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

22、p- /删除*q结点 free(q); else p=p-(10)有一个双链表L,设计一个算法查找第一个元素值为x的结点,将其与后继结点进行交换。先找到第一个元素值为x的结点*p,q指向其后继结点,本题是将*p结点移到*q结点之后,实现过程是:删除*p结点,再将其插入到*q结点之后。int swap(DLink *L,ElemType x) DLink *p=L- p- if (p=NULL) /未找到值为x的结点 return 0; else /找到值为x的结点*p q=p- /q指向*p的后继结点 if (q!=NULL) /*p结点不是尾结点 p-prior-next=q; /先删除*p结点 q-prior=p-prior; /将*p结点插入到*q结点之后 if (q-prior=p;prior=q; return 1; else /*p结点是尾结点 return 0; /无法与后继结点交换,返回0(11)对于有n(n1)个数据结点的循环单链表L,设计一个算法将所有结点逆置。采用头插法重建循环单链表L的思路,先建立一个空的循环单链表,用p遍历所有数据结点,每次将*p结点插入到前端。void Reverse(SLink *& L- /建立一个空循环单链表=L) p-next=L- /将*p结点插入到前端 L- p=q;上机实验题2有两个整数集合采用有序单

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

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