数据结构课后习题答案详解(C语言版_严蔚敏)2.pdf
《数据结构课后习题答案详解(C语言版_严蔚敏)2.pdf》由会员分享,可在线阅读,更多相关《数据结构课后习题答案详解(C语言版_严蔚敏)2.pdf(55页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数据结构习题集答案(C语肃.版严蔚敏)第 2 聿线性表2.1 描述以下三个概念的区别:头指针,头结点,首元结点(第个元素结点).解:头指针是指向链表中第一个结点的指针。元结点是指链表中存储第个数据元素的结点。头结点是在苜元结点之前附设的一个结点,该结点不存储数据元素,其指针域指向 元结点,其作用主要是为了方便对链表的操作。它可以对空表、非空表以及忏元结点的操作进行统处理。2.2 填空题。解:(1)在顺样表中插入或删除个元素,需要平均移动表中 华元素,具体移动的元素个数与元素在表中的位置有关。(2)顺序表中逻辑上相邻的元素的物理位置必定紧邻。单链表中逻辑上相邻的元素的物理位置不定紧邻。(3)在单
2、链表中,除了首元结点外,住结点的存储位置由其前驱结点的链域的值指示。(4)在单链表中设置头结点的作用是插入和删除首元结点时不用进行特殊处理。2.3 在什么情况下川顺序表比链表好?解:当级性表的数据元素在物理位置上是连续存储的时候,用顺序表比用链表好,其特点是可以进行随机存取.2.4 对以下单链表分别执行下列各程序段,并画出结果示意图。LT 2 H-d ;ii-!iH-f y n 4 ;卜解:(1)-L r r n 一4 y l l 一 r p i-LT 2|4;|!;II-1;II 4;卜 P Q R S(B p T r p n-j n-y T i-*P Q R SP(7)LT 2|1 1 ;
3、II-1 ;II-1 1 ;1卜PQR S2.5 画出执行下列各行语句后各指针及链表的示意图。L=(LinkList)malloc(sizeof(LNode);P=L;for(i=l:incxt=(LinkListjmal loc(sizeof(1 Jnext;P-next=NULL;for(i=4;i=l:i)for(i=l;idata=i*2-l;lns_LinkList(L,i+1,i*2);Del_LinkList(L,i):HZZD-HZLD QUZDDZ0L-OHZH-czo-zu-cm sizucpZBLH IIr m 4ii_1 6 ii_j;【I-8 wp2.6 已知L是无表
4、头结点的单链表,且P 结点既不是首元结点,也不是尾元结点,试从下列提供的答案中选择合适的语句序列。a.在 P 结点后插入S 结点的语句序列是 0b.在 P 结点前插入S 结点的i吾句序列是 Oc.在表首插入S 结点的语句序列是.d.在表尾插入S 结点的语句序列是。(1)P-next=S:(2)P-next=P-next-next;(3)P-next=S-next:(4)S-next=P-next;(5)S-next=L;(6)S-next=NULL;(7)Q=P:(8)while(P-ncxt!=Q)P=P-next;(9)while(P-next!=NULL)P=P-next;(10)4Q;
5、(11)P=L;(12)L=S;(13)L=P;解:a.(4)(1)b.(7)(11)(8)(4)(1)c.(5)(12)d.(9)(1)(6)2.7 已知L是带表头结点的非空单链表,且P 结点既不是首元结点,也不是尾元结点,试从下列提供的答案中选择合适的语句序列。a.删除P 结 点 的 直 接 后 继 结 点 的 语 句 序 列 是.b.删除P 结点的直接前驱结点的语句序列是_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _。c.删除P 结点的语句序列是_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _d.删除苜元结点的语句序列是e.删除尾元结
6、点的语句序列是(1)P=P-n e x t;(2)P-n e x t=P:(3)P-n e x t=P-n e x t-n e x t;(4)P=P-n e x t-n e x t;(5)w h i l e(P!=N U L L)P=P-n e x t;(6)w h i l e(Q-n e x t!=N U L L)P=Q;Q=Q-n e x t;)(7)w h i l e(P-n e x t!=Q)P=P-n e x t;(8)w h i l e(P-n e x t-n e x t!=Q)P=P-n e x t:(9)w h i l e(P-n e x l-n e x l!=N U L L)
7、P=P-n e x t:(1 0)Q=P;(1 1)Q=P-n e x t:(1 2)P=L;(1 3)L=L-n e x t:(1 4)f r e e(Q);解:a.(1 1)(3)(1 4)b.(1 0)c.(1 0)d.(1 2)(1 2)(8)(3)(1 4)(1 2)(7)(3)(1 4)(1 1)(3)(1 4)e.(9)(1 1)(3)(1 4)2.8 已知P结点是某双向链表的中间结点,试从卜.列提供的答案中选择合适的语句序列。a.在P结点后一插入S结点的酒句序列是 _ b.在 P结点前插入S结点的语句序列是.c.删除P 结点的R接后继结点的语句再列是 一.d.删除P结出的I 接
8、前骈结点的语句序列是e.删除P结 点 的 语 句 序 列 是 .(1)P-n e x l=P-n e x t-n e x t;(2)P-p r i o u=P-p r i o u-p r i o u;(3)P-n e x t=S;(4)P-p r i o u=S;(5)S-n e x t=P:(6)S-p r i o u=P;(7)S-n e x t=P-n e x t;(8)S-p r i o u=P-p r i o u:(9)P-p r i o u-n e x t=P-n e x t;(1 0)P-p r i o u-n e x t=P;(1 1)P-n e x t-p r i o u=P
9、;(1 2)P-n e x t-p r i o u=S;(1 3)P-p r i o u-n e x t=S;(1 4)P-n e x t-p r i o u=P-p r i o u;(1 5)Q=P-n e x t:(1 6)Q=P-p r i o u:(1 7)f r e e(P);(1 8)f r e e(Q);解:a.(7)(3)(6)(1 2)b.(8)(4)(5)(1 3)c.(1 5)(1)(1 1)(1 8)d.(1 6)(2)(1 0)(1 8)e.(1 4)(9)(1 7)2.9 箍述以下兑法的功能。(1)S t a t u s A(L i n k e d L i s t
10、L)(L 是无表头结点的单链表i f(L&L-n e x t)Q=L;L=l-n e x t;P=L;w h i l e(P-n e x t)P=P-n e x t;P-n e x t.=Q:Q-n e x t=N U L L;)r e t u r n O K;(2)v o i d B B(L N o d e *s,L N o d e q)(P=s:w h i l e(p-n e x t!=q)p=p-n e x t:p-n e x t =s;v o i d A A(L N o d e *p ar L N o d e *p b)(/p a 和 p b 分别指向单循环链表中的两个结点B B(pa
11、.pb);B B (pb,pa);解:(1)如果L 的长度不小于2,将 L 的首元结点变成尾元结点。(2)将单循环链表拆成两个单循环链表。2.1 0 指出以下算法中的错误和低效之处,并将它改写为一个既正确乂高效的算法。S ta tus DeleteKC S q Lis t&a,int i,int k)(本过程从顺序存储结构的线性表a中删除第i个元素起的k 个元素if(i l|k a.length)r etur n INFEA S IB LE:参数不合法els e(for(count:1;count=i+l;j)a.elem j-i=a.elemtj;a.length:r etur n OK;)
12、解:S ta tus DeleleK(S q Lis t&a,ini i,ini k)(从顺序存储结构的线性表a中删除第i个元素起的k个元素注意i的编号从0开始int j;if(i a.length-1 1|k a.length-i)r etur n INFEA S IB LE:for(j=0:j 0,x va.elem i-l;i -)va.clem i=va.e 1 er a i-1 ;va.elem i=x:va.length+;r etur n OK;)2.i2 设4=(4,,)和B =(/7 ,/?)均为顺序表,Ar和8 分别为A和B中除去最大共同前缀后的子表。若A=5=空表,则4=
13、3:若4=空表,而8 w空表,或者两者均不为空表,n A!的首元小于B 的首元,则A B 试写-个比较A ,B大小的算法。解:S ta tus C ompa r eOr der Lis t(S q Lis t&A,S q Lis t&B)(int i,k,j;k=A.length B.length?A.lengthzB.length;for(i=0;i B.elem i)j=l:if(A.elem i)j=-l;if(A.length k)j=l:if(B.length k)j=-l;if(A.length=B.length)j=0;r etur n j:12.1 3试写-算法在带头结点的单链
14、表结构上实现线性表操作Loca te。”x);解:int Loca teEler a _ L(LinkLis t&L,ElemT ype x)(int i=0:LinkLis t p=L:while(p&p-da ta!=x)(p=p-next;i+;if(!p)r etur n 0:els e r etur n i;)2.1 4试写 噂法在带头结点的单链表结构上实现线性表操作Lenglh(L).解:返【可单链表的长度int Lis tLcngth L(LinkLis t&L)(int i=0;LinkLis t p=L;if(p)p=p-next;while(p)p=p-next;i+;r
15、etur n i;)2.1 5已知指针h a和h b分别指向两个单链表的头结点,并且已知两个链表的长度分别为m和n 0试写一算法将这两个链表连接在一起,假设指针he指向连接后的链表的头结点,并要求算法以尽可能短的时间完成连接运算。请分析你的算法的时间更杂度。解:void Mcr gcLis t L(LinkLis t&ha,Linkl.is t&hb,LinkLis t&hc)(LinkLis t pa,pb;pa=ha;pb=hb;while(pa-next&pb-next)(pa=pa-nexl;pb=pb-next:)if(!pa-next)hc=hb;whilc(pb-next)pb=
16、pb-next;pb-next=ha-next:els e(hc=ha;while(pa-nexl)pa=pa-next;pa-next=hb-next;)2.1 6已知指针la和lb分别指向两个无头结点单链表中的首元结点。卜列克法是从表la中删除自第i个元索起共len个元素后,将它们插入到表1 b中第i个元素之前。试问此算法是否jE确?若有错,请改正之。S ta tus DeleteA ndlns er tS ub C LinkedLis t la,LinkedLis t lb,int i,int j,int len)(if(i 0|j 0|len 0)r etur n INFEA S IB
17、 LE;p=la:k=l;while(k next;k+;q=P;while(k next:k+;1s=lb:k=l;while(k next:k+:s-next=p:q-nexl=s-nexI;r etur n OK:解:S ta tus De1 eteA ndIns er tS ub(LinkLis t&la,LinkLis t&Ib,int i,int j,int len)(LinkLis t p,q,s.pr ev=NU L L:i n t k=l;i f(i 0|j 0|l e n 0)re turn I NF E A SI B L E;/在l a表中查找第i个结点P=l a;w h
18、 i l e(p&k n e x t;k+;i f(!p)re turn I NF E A SI B L E:/在l a表中查找第i+l e n-1个结点q=P;k=l;w h i l e(q&k n e x t;k+;i f(!q)re turn I NF E A SI B L E:/完成删除,注意,i=l的情况需要特殊处理i f (!p re v)l a=q-n e x t;e l se p re v-n e x t=q-n e x t;/将从l a中删除的结点插入到l b中i f(j=l)q-n e x t=I b:l b=p:e l se s=l b;k=l:w h i l e(s&k
19、 n c x t:k-H-;)i f(!s)re turn I NF E A SI B L E;q-n e x t=s-n e x t;s-n e x t=p;完成插入re turn OK:)2.1 7试写 算法,在无头结点的动态单链表上实现线性表操作I n se rt(L i,b),并和在带头结点的动态单链表上实现相同操作的算法进行比较。2.18试写 算法,实现线性表操作D e l e te d,i),并和在带头结点的动态单链表上实现相同操作的算法进行比较。2.1 9已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写高效的算法,胴除表中所有值大于m i n k且小于i n a x
20、 k的元素(若表中存在这样的元素),同时群放被删结点空间,并分析你的算法的时间史杂度(注意,m i n k和m a x k是给定的两个参变量,它们的值可以和表中的元素相同,也可以不同)。解:Sta tus L i stD e l e te L(L i n k L i st&L,E l e m Ty p c m i n k,E l e m Tvp e m a x k)(L i n k L i st p,q,p re v=NUL L;i f(m i n k m a x k)re turn E RROR;P=L;p re v=p;p=p-n e x t;w h i 1c(p&p-d a ta d a
21、 ta n e x t;)e l se p re v-n e x t=p-n e x t;q=P;p=p-n e x t;f re e(q);1)re turn OK;)2.20同2.1 9题条件,试写 高效的算法,删除表中所有值相同的多余元素,(使得操作后的线性表中所有元素的值均不相同),同时释放被删结点空间,并分析你的算法的时间发杂度。解:vo i d L i stD e l e te _ L Sa m e No d e(L i n k L i st a L)(L i n k L i st p,q,p re v;P=L;p re v=p:p=p-n e x t;w h i l e(p)p
22、re v=p:p=p-n e x l;i f (p&p-d a ta=p re v-d a ta)(p re v-n e x t=p-n e x t;q=P;p=p-n e x t;f re e(q);)2.2 1试写 算法,实现顺序表的就地逆置,即利用原表的存储空间将线性表(”,0)逆置为。解:福 序表的逆置Sta tus L i s t0p p o se _ Sq(Sq L i s t&L)(i n t i;E l c m Ty p e x;f o r(i=0:i n e x t;L-n e x t=NUL L:w h i l e(p)(q=p;p=p-n e x t;q-n e x t=
23、L-n e x t:L-n e x t=q:)re turn OK;)2.2 3设线性衣A=,Q)8=(也,也)试写一个按下列规则合并A,B为线性表C的算法,即使得C=(%,仿3,3+1,也,)m L i n k L i st&B,L i n k L i st&C)(L i n k L i st p a,p b,q a,q b;p a=A-n e x t:p b=B-n e x t:C=A;w h i l e(p a&p b)q a=p a:q b=p b;p a=p a-n e x t:p b=p b-n e x t:q b-n e x l=q a-n e x t:q a-n e x t=q
24、 b;)i f(!p a)q b-n e x t=p b;p b=B;f re e(p b);re turn OK:)2.2 4假设有两个按元素值递增有序排列的线性发A和B,均以单链表作存储结构,请编写算法将A表和B表归并成一个按元素值递减存序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原表(即A表和B表)的结点空间构造C表。解:/将合并逆置后的结果放在C表中,并删除B表Sta tus L i stMe rge Op p o se _ L(L i n k L i st&A,L i n k L i st&B,L i n k L i st&C)(L i n k L i st
25、 p a,p b,q a,q b:p a=A;p b=B:q a=p a;/保存p a的前驱指针q b=p b;/保存p b的前驱指针p a=rp a-n e x t:p b=p b-n e x t;A-n e x t=NUL L:C=A;w h i l e(p a&p b)(i f(p a-d a ta d a ta)q a=p a;p a=p a-n e x t;q a-n e x t=A-n e x t;将当前最小结点插入A表表头A-n e x t=q a:e l se q b=p b;p b=p b-n e x t:q b-n e x t=A-n c x t;将当前最小结点插入A表表头
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课后 习题 答案 详解 语言版 严蔚敏
限制150内