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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

数据结构习题集参考答案.docx

1、数据结构习题集参考答案第1章 绪论一、单项选择题1B D。2C。3A。4A。5C A6C。7B8 C9 C10C二、判断题(在各题后填写“”或“”)1. 线性结构只能用顺序结构来存放,非线性结构只能用非顺序结构来存放。()2. 数据元素是数据的最小单位。( )3. 记录是数据处理的最小单位。 ( ) 4. 算法就是程序。()5. 数据的逻辑结构是指数据的各数据项之间的逻辑关系;( ) 6数据的物理结构是指数据在计算机内的实际存储形式。( ) 7. 在顺序存储结构中,有时也存储数据结构中元素之间的关系。( )8. 顺序存储方式的优点是存储密度大,且插入、删除运算效率高。( )9. 线性表若采用链

2、式存储结构时,要求内存中可用存储单元的地址一定是不连续的。( )10. 数据的逻辑结构说明数据元素之间的顺序关系,它依赖于计算机的储存结构. ( )三、填空题1. 逻辑结构 物理结构 操作(运算) 算法2. 集合 线性结构 树形结构 图状结构或网状结构2. 没有 1 没有 1 4. 前驱 1 后续 任意多个 5表示(又称映像)6.顺序存储方式 链式存储方式 索引存储方式 散列存储方式7(1)逻辑特性 (2)在计算机内部如何表示和实现 (3)数学特性8算法的时间复杂度和空间复杂度9(1)有穷性 (2)确定性 (3)可行性10. 1 log2n n n2 2n 实际不可计算 高效11. (n+3)

3、(n-2)/211 (1)1 (2)1 (3)f(m,n-1) (4)n 913. o(log2n)。四、应用题1解答:(1)图略。线性结构(2)图略。树结构(3)图略。图结构2将学号、姓名、平均成绩看成一个记录(元素,含三个数据项),将100个这样的记录存于数组中。因一般无增删操作,故宜采用顺序存储。 typedef struct int num;/学号 char name8;/姓名 float score;/平均成绩 node; node student100;3. 第一层FOR循环判断n+1次,往下执行n次,第二层FOR执行次数为(n+(n-1)+(n-2)+1),第三层循环体受第一层循

4、环和第二层循环的控制,其执行次数如下表: i= 1 2 3 n j=n n n n n j=n-1 n-1 n-1 n-1 j=3 3 3j=2 2 2j=1 1执行次数为(1+2+n)+(2+3+n)+n=n*n(n+1)/2-n(n2-1)/6。在n=5时,f(5)=55,执行过程中,输出结果为:sum=15,sum=29,sum=41,sum=50,sum=55(每个sum= 占一行,为节省篇幅,这里省去换行)。4解答:()int locate(dataytpe A1.n,dateytpe k) i=1; while (i=n)&(Ai!=k) i+; if (i=n) return(i

5、); else return(o); 最坏时间复杂度T(n)=O(n).()Void CZ_max(datatype An,x,y) x=A1; y=A1; for(i=2;i=n;I+) if(xAiy=x;x=Ai; /*替换最大值*/ else if(ynext=px-next; px-next=py9. 4 210 i=1; iL.last11(1)L-next=null 置空链表,然后将原链表结点逐个插入到有序表中 (2)p!=null 当链表尚未到尾,p为工作指针 (3)q!=null 查p结点在链表中的插入位置,这时q是工作指针。 (4)p-next=r-next 将p结点链入链

6、表中 (5)r-next=p r是q的前驱,u是下个待插入结点的指针。12(1)(A!=null & B!=null) 两均未空时循环(2)A-element=B-element 两表中相等元素不作结果元素(3)B=B-link 向后移动B表指针(4)A!=null 将A 表剩余部分放入结果表中(5)last-link=null 置链表尾四、应用题 1. 试述头结点,首元结点,头指针这三个概念的区别. 参考答案: 在线性表的链式存储结构中,头指针指链表的指针,若链表有头结点则是链表的头结点的指针,头指针具有标识作用,故常用头指针冠以链表的名字。头结点是为了操作的统一、方便而设立的,放在第一元素

7、结点之前,其数据域一般无意义(当然有些情况下也可存放链表的长度、用做监视哨等等),有头结点后,对在第一元素结点前插入结点和删除第一结点,其操作与对其它结点的操作统一了。而且无论链表是否为空,头指针均不为空。首元结点也就是第一元素结点,它是头结点后边的第一个结点。 2. 在单链表和双向链表中,能否从当前结点出发访问到任何一个结点?在单链表中不能从当前结点(若当前结点不是第一结点)出发访问到任何一个结点,链表只能从头指针开始,访问到链表中每个结点。在双链表中求前驱和后继都容易,从当前结点向前到第一结点,向后到最后结点,可以访问到任何一个结点。3. 一线性表存储在带头结点的双向循环链表中,L为头指针

8、。如下算法:(1)说明该算法的功能。(2)在空缺处填写相应的语句。void unknown (BNODETP *L) p=L-next; q=p-next; r=q-next;while (q!=L) while (p!=L) & (p-dataq-data) p=p-prior;q-prior-next=r;(1) _ _;q-next=p-next;q-prior=p;(2) _ _;(3) _ _; q=r;p=q-prior;(4) _ _; 1)本算法功能是将双向循环链表结点的数据域按值自小到大排序,成为非递减(可能包括数据域值相等的结点)有序双向循环链表。2)(1)r-prior=

9、q-prior;将q结点摘下,以便插入到适当位置。(2)p-next-prior=q;(2)(3)将q结点插入(3)p-next=q;(4)r=r-next;或r=q-next;后移指针,再将新结点插入到适当位置。五、算法设计题1. 题目分析 在递增有序的顺序表中插入一个元素x,首先应查找待插入元素的位置。因顺序表元素递增有序,采用折半查找法比顺序查找效率要高。查到插入位置后,从此位置直到线性表尾依次向后移动一个元素位置,之后将元素x插入即可。void Insert(ElemType A,int size, ElemType x) A是有size个元素空间目前仅有num(numsize)个元素

10、的线性表。本算法将元素x插入到线性表中,并保持线性表的有序性。 low=1;high=num; /题目要求下标从1开始 while(lowx)high=mid-1 ;else low=mid+1 ; for(i=num;i=low;i-) Ai+1=Ai;元素后移。 Ai+1=x; 将元素x插入。 算法结束。算法讨论 算法中当查找失败(即线性表中无元素x)时,变量low在变量high的右面(low=high+1)。移动元素从low开始,直到num为止。特别注意不能写成for(i=low;i=num;i+)Ai+1=Ai,这是一些学生容易犯的错误。另外,题中未说明若表中已有值为x的元素时不再插入

11、,故安排在Amid= =x时,用low(=mid+1)记住位置,以便后面统一处理。查找算法时间复杂度为O(logn),而插入时的移动操作时间复杂度为O(n),若用顺序查找,则查找的时间复杂度亦为O(n)。2解答:(1)顺序表分析:将顺序表的第一个元素与最后一个元素互换,第二个元素与倒数第二个元素互换。void invert(SeqList *L, int *num) int j; ElemType tmp;for(j=0;jnext =NULL) return; /*链表为空*/ p=L-next; q=p-next; p-next=NULL; /* 摘下第一个结点,生成初始逆置表 */whi

12、le(q!=NULL) /* 从第二个结点起依次头插入当前逆置表 */ r=q-next;q-next=L-next;L-next=q;q=r; 3解答:(1)定位LOCATE(L,X)在带头结点类单链表上实现的算法为:int locate_lklist(lklist head,datatype x)/*求表head中第一个值等于x的的序号,不存在这种结点时结果为0*/p=head-next;j=1; /*置初值*/while(p!=NULL)&(p-data!=x)p=p-next;j+/*未达表结点又未找到值等于X的结点时经,继续扫描*/if (p-data = =x) return(j)

13、;else return(0);在无头结点的单链表上实现的算法为:int Wlocate(lklist head,datatype X)/*求表head中第一个值等于x的结点的序号。不存在这种结点时结果为0*/p=head; j=1; /*置初值*/while(p!=NULL)&(p-data!=x)p=p-next;j+/*未达表结点又未找到值等于X的结点时经,继续扫描*/if( p-data = =X) return(j);else return(0);(2)按序号查找find(L,i)在带头结点的单链表上实现的算法为:pointer find_lklist(lklist head , i

14、nt i); j=1; p=head-next;while(jnext; j+if(i= = j) return(p); else return(NULL);在无头结点的单链表上实现的算法为:pointer find_lklist(lklist head , int i); j=1; p=head;while(jnext; j+if(i= = j) return(p); else return(NULL);(3)、插入INSERT(L,X,i) 在带头结点单链表上实现的算法为: void insert_lklist(lklist head,datatype x,int I)/*在表haed的第

15、i个位置上插入一人以x为值的新结点*/p=find_lklist(head,i-1); /*先找第i-1个结点*/if(p= =NULL)reeor(“不存在第i个位置”)/*若第i-1个结点不存在,退出*/elses=malloc(size);s-data=x /*否则生成新结点*/s-next=p-next /*结点*p在链域值传给结点*s的链域*/p-next=s; /*修改*p的链域*/在无头结点的单链表上实现的算法为:void Winsert(lklist head,dataytpe X,int i)/*在表haed的第i个位置上插入一人以x为值的新结点*/if(i=0) error

16、(“idata=X; /*否则生成新结点*/ if(i= =1)s-next=head;head=s; else p=wfind_lklist(lklist head,i-1);if(p= =NULL) error(“in+1”); elses-next=p-next;p-next=s;(4)删除DELDTE(L,i)在带头结点的单链表上实现的算法为:void delete_lklist(lklist head,int i) /*删除表head的第i个结点*/p=find_lklist(head,i-1) /*先找待删结点的直接前驱*/if(p!=NULL)&(p-next!=NULL)/*若

17、直接前趋存在且待结点存在*/(q=p-next; /*q指向待删结点*/p-next=q-next/*摘除待结点*/;free(q);/*释放已摘除结点q*/else error(“不存在第i个结点”)/*否则给出相关信息*/在无头结点的单链表上实现的算法为:void Wdelete(lklist head,int i)/*删除表head的第i个结点,若该链表仅有一个结点时,赋该结点指针NULL*/if(inext;free(q);elsep=wfind_lklist(head,i-1);/*找链表head中第i-1结点指针*/if(p!=NULL)&(p-next!=NULL)q=p-nex

18、t; p-next=q-next; free(q);else error(“不存在第I个结点”);4【解答】算法如下:LinkList merge(LinkList A, LinkList B, LinkList C) Node *pa, *qa, *pb, *qb, *p; pa=A-next; /*pa表示A的当前结点*/ pb=B-next; p=A; / *利用p来指向新连接的表的表尾,初始值指向表A的头结点*/ while(pa!=NULL & pb!=NULL) /*利用尾插法建立连接之后的链表*/ qa=pa-next; qb=qb-next; p-next=pa; /*交替选择

19、表A和表B中的结点连接到新链表中;*/p=pa;p-next=pb;p=pb; pa=qa;pb=qb;if(pa!=NULL) p-next=pa; /*A的长度大于B的长度*/ if(pb!=NULL) p-next=pb; /*B的长度大于A的长度*/C=A; Return(C);5. 题目分析 在顺序存储的线性表上删除元素,通常要涉及到一系列元素的移动(删第i个元素,第i+1至第n个元素要依次前移)。本题要求删除线性表中所有值为item的数据元素,并未要求元素间的相对位置不变。因此可以考虑设头尾两个指针(i=1,j=n),从两端向中间移动,凡遇到值item的数据元素时,直接将右端元素左

20、移至值为item的数据元素位置。void Delete(ElemType A ,int n)A是有n个元素的一维数组,本算法删除A中所有值为item的元素。i=1;j=n;设置数组低、高端指针(下标)。 while(ij) while(ij & Ai!=item)i+; 若值不为item,左移指针。 if(ij)while(ij & Aj=item)j-;若右端元素值为item,指针左移 if(inext;while (q-nest!=s) p=q; q=q-next;p-next=s; free(q);7分析:在链表L中依次取元素,若取出的元素是字母,把它插入到字母B中,然后在L中删除该元素

21、;若取出的元素是数字,把它插入到数字链D中,然后在L中删除该元素。继续取下一个元素,直到链表的尾部。最后B、D、L中分别存放的是字母字符、数字字符和其它字符。设原表有头结点、头指针L,新建数字字符链D,字母字符链B,其它字符链R。void DISM_lklist(lklist L,lklist D,lklist B,lklist R) D =malloc(size of(int); D -next= D; /*建D循环链表头结点*/ B =malloc(sizeof(char); B -next= B; /*建B循环链表头结点*/p= L;q=p-next;while(q!=null) if(

22、q-datadata=0) p-next=q-next; /*在表L 中摘除q结点*/ q-next= D -next; D -next=q; /*将q结点插入D中*/ q=p-next; /*移动q指针*/ else if (q-datadata=a)|(q-datadata=a) p-next=q-next; /*在表L中删除q 结点*/q-next= B -next; B -next=q; /*将q结点插入B中*/q=p-next; /*移动q指针*/else p=q;q=p-next; /*移动q指针*/p-next=L;R=L; /*使R为循环表*/ 8约瑟夫环问题【解答】算法如下:

23、typedef struct Nodeint password;int num;struct Node *next; Node,*Linklist;void Josephus() Linklist L; Node *p,*r,*q; int m,n,C,j; L=(Node*)malloc(sizeof(Node); /*初始化单向循环链表*/ if(L=NULL) printf(n链表申请不到空间!);return; L-next=NULL; r=L; printf(请输入数据n的值(n0):); scanf(%d,&n); for(j=1;jpassword=C; p-num=j; r-next=p; r=p; r-next=L-next;printf(请输入第一个报数上限值m(m0):); scanf(%d,&m); printf(*n); printf(出列的顺序为:n); q=L; p=L-next; while(n!=1) /*计算出列的顺序*/ j=1; while(jnext; j+;

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

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