1、数据结构复习题要点线性表 解答题2阅读下面算法,指出其中所有的错误。(5分) FUNC length(head:linklist):integer; 求以head为头指针的不带头结点的循环单链表的长度 f:=head; WHILE f head DO n:=n+1;p:=p1ink;RETURN(n)ENDPF;length解答:(1)n未初始化为0(1分) (2)循环条件不对,应为WHILE f1inkhead DO (2分) (3)循环变量f的值应在循环体内改变,即p应改为f (1分) (4)未处理空表的情形。(1分)正确的算法是:FUNC length(head:linklist):in
2、teger;求以head为头指针的不带头结点的循环单链表的长度n:=0IF headNIL THENf:=head.link; n:=1;WHILE f head DOn:=n+l; f:=f.link;RETURN(n)ENDF;length 解答题4、在线形表的顺序和链式存储结构下,试分析下表各种基本运算时间复杂度,并填入相应的表格中。(5分)运算求表长取元素取前趋取后继插入顺序存储结构O(1)O(1)O(1)O(1)O(n)链式存储结构O(n)O(n)O(n)O(1)O(n) 单选题2链表不具备的特点是_。(1分) (1)可随机访问任一元素 (2)插入删除不需要移动元素(3)不必事先预分
3、存储空间 (4)所需空间与线形表长度成正比答案:(1) 单选题4若线性表最常用的操作是存取第i个元素及其前趋的值,则采用_存储方式节省时间。(1分) (1)单链表 (2)双链表 (3)单循环链表 (4)顺序表答案:(4) 单选题5若某链表最常用的操作是在最后一个元素之后插入一个结点和删除最后一个结点,则采用_存储方式节省时间。(1分)(1)单链表 (2)双链表 (3)单循环链表 (4)顺序表答案:(4) 判断题1在顺序表中取出第i个元素所花费的时间与i成正比( ) (1分) 解答题2将下面算法划线处用具体语句表示,使其完成所要求的功能。(5分) PROC ins_linklist(1a:lin
4、klisttp;i:integer;b:elemp); 1a为带头结点单链表的头指针,在i之前插入数据元素b p:=Lanext;j:=0; WHILE(循环控制条件) DO循环体部分; IF(判定条件) THEN ERROR(I非法) ELSEnew(s);s1data:=b; 插入链表部分ENDP;ins linklist解答:WHILE (pnil AND ji-1) THEN ERROR(i ) ELSE new(s);sdata:=b; snext:= p next; pnext:=s 解答题4试设计一种链队列的存储结构,要求只用一个指针,并且使其插入和删除的时间复杂度均为O(1)。
5、试画出存储结构,并指出队首和队尾。(5分)解答:采用仅有尾指针rear的循环单链表表示队列(如图),队空时rear=nil,队首的第一个结点(front=rearnext),队尾为最后一个结点(rear)。 填空题5在数据结构中,从逻辑上可以把数据结构分为 线性 结构和 非线性 结构。(2分) 算法题2设双端链表结构如下;头结点有俩个域,其中:firstlink指向第一个数据结点,lastlink 指向最后一个数据结点,链表空时,firstlink=lastlink=NIL。阅读下面的算法,用适当的语句完成各画线的处理,使其能实现删除链表中的data域为x的所有结点功能。(10分) PROC
6、DELETE(L,x); p:=Lfirstlink; q:=L; WHILE pNIL DO IF p.data=x THEN CASE L=q: 第一个结点为x和只有一个结点且为x的处理 L 1astlink=p: 最后一个为x的处理 Others:其它结点为x的处理 ENDC ELSE不为x的处理 ENDP;DELETE算法:PROC DELETE(L,x); p:=Lfirstlink; q=L; WHILE p NIL DO IF pdata=x THEN CASE L=q:Lfirstlink:=plink; IFplink=NIL THEN L lastlink:=NIL;p:=
7、plink; Llastlink=p: Llastlink:=q; qlink:=p link;p:=plink Others:qlink:=p1ink;p:=plink ENDC ELSEq:=p;p:=plink ENDP;DELETE 算法题1、假设以下不带头结点的循环链表Q表示队列,并且只一个rear指针指向队尾元素结点,队列空时Q.rear=nil 试编写相应的出队函数FUNC delq(Q):elem和队列操作addq(Q,elem)的算法(10分)算法:PROC addq(Q,elem); New(p);Pdata:=elem:(1分) IF Q.rear=nil THEN pl
8、ink:=p (1分) ELSE Plink:=Qrear1ink; Qrear1ink:=p;(2分) Q.rear:=p (1分) ENDP; FUNC delq(Q):elem: IF Qrear=NIL THEN RETURN (NULL) (1分) ELSEp:=Qrearlink; (1分) IF p=Qrear THEN Qrear:=NIL /只有一个结点 ELSE Qrearlink:=p.link; (2分) RETURN(pdata) (1分) ENDF; 单项选择题10循环链表的主要优点是( )。(1分) A. 已知某结点位置后能容易找到其直接前趋 B在进行插入、删除元
9、素时能保证链表不断开 C. 不再需要头指针 D从表中任一个结点出发都能扫描整个链表答案:D 填空题1线性表、栈和队列都是 线性 结构,可以在线性表的 任何 位置插入和删除元素:而栈只能在 栈顶 插入和删除元素;对于队列只能在 队尾 插入元素、在 队首 删除元素。(5分) 简答题4线性表有哪两种存储结构?在这两种存储结构中元素之间的逻辑关系分别是通过什么决定的? (5分) 答:有顺序和链式两种存储结构,顺序结构中元素之间的逻辑关系由物理存储位置决定,链式结构中元素之间的逻辑关系由链指针决定。 算法题1、试编写算法,将一个带头结点的单循环链表A,按结点值分解为奇数和偶数两个具有相同结构的链表A和C
10、,其中C的结点是原A中结点值为偶数的结点。要求利用原链表的结点。可用ODD(pdata)逻辑函数判断指针p的值data是否为奇数,是则返回true。(9分)PROC ODDEVEN(1a,lc:link); New(lc); pc:=lc; / 建C的头结点 P:=la.next; Q:=la; WHILE P la DO IF ODD(P.data) THENQ:=P; P:=P.next ELSEQ.next:=P.next; / 删除 pc.next:=P; pc:=P; / 插入 P:=Q.next; pc.next:=lc /lc成循环链ENDP;ODD_EVEN 【经典考题】 数据
11、结构是研究数据的 和 ,以及它们之间的相互关系,并对这种结构定义相应的 ,设计出相应的 ,而确保经过这些运算后所得到的新结构是 结构类型。解:本部分基本上都是概念试题。参考答案依次为:物理结构、逻辑结构、运算、算法、原来的。 【经典考题】 在数据结构中,与所使用的计算机无关的数据叫A结构:链表是一种采用B存储结构存储的线性表;链表适用于C查找;在链表中进行D操作的效率比在顺序存储结构中进行D操作效率高;二分查找E存储结构。供选择的答案:A)存储 物理 逻辑 物理和逻辑B)顺序 网状 星式 链式C)顺序 二分法 顺序,也能二分法 随机D)二分法查找 快速查找 顺序查找 插入E)只适用于链式 只适
12、用于顺序 既适用于顺序也适用于链式既不适用于顺序也不适用于链式解:本题旨在考察基本的概念。答案为:A) ;B);C);D);E)。【经典考题】 在双向链表存储结构中,删除P所指的结点时,需修改指针( )。A)(P-llink)-rlink=P-rlink B)P-llink=(P-llink)-llink(P-rlink)-llink=P-llink (P-llink)-llink)rlink=PC) (P-llink)-llink)-rlink=P D) (P-rlink)-rlink)-llink=PP-llink=(P-llink)-llink P-rlink=(P-rlink)-rli
13、nk解:答案为A)。 考虑在P所指结点后或前插入一结点的应如何做?【经典考题】 根据线性表的链式存储结构形式,每个结点所含指针的个数,链表可分为A和B:而根据指针的连接方式,链表又可分为C和D。解:A:单链表; B:多重链表; C:循环链表; D:普通链表。【经典考题】 在一个具有n个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度为 。 解:O(n)。【经典考题】 (1)写出在双向链表中,在指针P所指结点前面插入一个结点*S的语句序列。 (2)写出带头结点的双向循环链表L为空表的条件。解:(1) S-Prior=P-Prior; P-Prior-Next=S;S-Next=P; P-P
14、rior=S;(2) (L= =L-Next)&(L= =L-Pnor) 考虑不带头结点的双向循环链表L为空表的条件?【经典考题】将两个各有n个元素的有序表归并成一个有序表,其最少的比较次数是 ( )。A)n B)2n-1 C)2n D)n-1解:答案为A)栈和队列 解答题3、设循环队列cq的队首指针为front,队尾指针为rear,队列可容纳的最大元素个数为max,分别用下列三种方法来区分队满或队空,试在表中写入相应的处理。(5分)用记数变量C记载元素个数用标志位牺牲一个元素的存储单元初始空队列各变量初值cq.fornt:=cq.rear:=0 C:=0cq.fornt:=cq.rear:=
15、0 tag:=0cq.fornt:=cq.rear:=0出队前判队空条件C=0tag=0 AND cq.fornt=cq.rearcq.fornt=cq.rear入队前判队满条件C=maxtag=1 AND cq.fornt=cq.rear(cq.rear+1)%max=cq.front出队时该方法的特殊处理cq.fornt:=(cq.fornt+1)%maxC:=C-1cq.fornt:=(cq.fornt+1)%max IF cq.front=cq.rear THENTag:=0cq.fornt:=(cq.front+1)%max入队时该方法的特殊处理cq.rear:=(cq.rear+1
16、)%max C:=C+1cq.rear:=(cq.rear+1)%maxIF cq.front=cq.rear THENTag:=1cq.rear:=(cq.rear+1)%max 填空题3递归过程实现时使用的数据结构是_栈,层次遍历二叉树时使用的数据结构是队列(2分) 不定项选择题3、一个队列的入队序列是a,b,c,d,则它的所有可能的出队序列是(2分)d,c,b,a a,d,c,b a,b,c,d c,b,d,a答案: 算法题2利用两个栈S1和S2模拟一个队列,该队列如下图所示,试写出队空和队满条件,并编写出队列的插入add和删除delete运算。 (10分)-m 0 1 n top1=f
17、ront S1S2 top2=rearPROC add(x:elementype)将x插入到队尾中 IF top2=n THEN ERROR( 队满) ELSE top2:=top2+1; IF top20 THEN S2top2:=x ELSE S1top2:=xENDP;addPROC delete(var x:elementype)删除队首元素,并赋给x IF top1top2 THEN ERROR(队空) ELSE IF top11 THEN x:=S1top1 ELSE x:=S2top1; top1:=top1+1 ENDP;delete【经典考题】一般情况下,将递归算法转换成等价
18、的非递归算法应该设置( )。A)栈 B)队列 C)堆栈或队列 D)数组解:栈的用途之一就是将递归转换为非递归,选择A)。 【经典考题】若一个栈的输入序列是1,2,3,n,输出序列的第一个元素是n,则第i个输出元素是( )。A)n-i B)n-i+1 C)i D)n-i-1解:答案为B)。【经典考题】在用一维数组sequ0m-1存储循环队列的元素时,怎样另设一个标志tag来区分尾指针(rear)和头指针(front)相等时队列的状态是“空”还是“满”?解:设标志tag的初始值为“0”,如果由于元素入队列使得rear= =front时,则置tag为“1”:反之,如果由于元素出队列使得rear= =
19、front成立,则可由标志tag的值来区别队列当前的状态是“满”还是“空”,即可决定其操作是否能进行。树和二叉树 解答题1设链域占俩个单元,数据域占一个单元,N结点的M叉树比N个结点的二叉树多占用多少个存储单元? (5分) 解答:m叉树占用2n*m+n个单元,二叉树占用2n*2+n个单元,故多占用2n(m-2)个单元。(5分) 解答题4.对给定的非空二叉树回答下列问题:(共5分) (1)前序和中序遍利结果相同的二叉树具有什么形状? (2)后序和中序遍利结果相同的二叉树具有什么形状? (3)前序和后序遍利结果相同的二叉树具有什么形状?解答:(1)只有一个根结点的二叉树和右单枝二叉树;(2分)(2
20、)只有一个根结点的二叉树和左单枝二叉树;(2分)(3)只有一个根结点的二叉树;(1分) 算法题2试编写将二叉树转换成树林的算法(10分)。设树林的各棵树用带头结点的单连表连接。连表头指针为F,连表结点结构为rootlink和nextlink,其中rootlink为指向树林中某棵树的根的指针,nextlink为指向下一棵树的指针,二叉树的结点结构为:lchild,data,rchild过程定义如下:PROC BttoForest(bt:bittrepit,F:linklist)ENDP;BttoForest算法:PROC BttoForest(bt:bittrepit,F:linklist)Ne
21、w(s):F=s; /树林单链表头结点p:=bt;WHILE pNIL DOnew(q); q.rootlink=p; / 建树林单链表结点 p:=p.rchild;q.rootlink.rchild:=NIL; / 把一棵树分离出,P已指向下一棵的树根s.nextlink:=q; s:=q; / 树林单链表结点进链s.nextlink:=NILENDP;BttoForest 解答题5、对二叉树回答下列问题(5分)(1)在先序、中序和后序遍历结果中,那些结点的相应次序不发生改变?(2)若中序遍历某二叉树得到一个结点值递增的有序序列,则该二叉树为排序二叉树。该判断是否正确?为什么?(3)设二树中
22、无度为1的结点,试用叶结点数表示二叉村的结点数。解答:(1)叶结点 (2)正确 (3)2n0-1 算法题2、试编写将用二叉链表表示的具有N个结点的二叉树转换成用邻接存储二叉树的算法。(10分)设二叉链表的结点结构为:lchild data rchild邻接点的头接点数组为adjlist(l:n),数组结构为:data firstarc adjvex nextarc并假设算法中可以直接使用以下队列操作:初始化操作:INITQUEUE(Q)判队空函数:EMPTY(Q)入队操作:ENQUEUE(Q,X)出队操作:DLQUEUE(Q)PROC bt_to_adj(bt:bitreptr; n:inte
23、ger; adjlist:ARRAYn OF vexnode):bt 为二叉树的根,n为结点数,adjlist为邻接表头接点数组参考算法:INITQUEUE(Q);i:=1;ENQUEUE(Q,bt); /树根进队WHILE in+1 AND (NOT EMPTY(Q) DO /建好数组,填充数组data域,并把结点在数组中 p:=DLQUEUE(Q); /位置i存进设二叉链表的结点data域, adjlisti.data:=p.data; p.data:=i; i:=i+1; IF p.lchildNIL THEN ENQUEUE(Q,p.lchild); IF p.rchildNIL TH
24、EN ENQUEUE(Q,p.rchild) i:=1;WHILE in+1 AND (NOT EMPTY(Q) Do /建立链表, 从子女的data域中取出其在数组中的 p:=DLQUEUE(Q); /位置i,存入adjvex CASE p.lchildNIL AND p.rchild=NIL: NEW(q); adjlisti.firstarc:=q; q.adjvex:=P.lchild.data; q.nextarc:=NIL p.lchild=NIL AND p.rchildNIL: NEW(q); adjlisti.firstarc:=q; q.adjvex:=P.rchild.d
25、ata; q.nextarc:=NIL p.lchildNIL AND p.rchildNIL:NEW(q); adjlisti.firstarc:=q; q.adjvex:=P.lchild.data; NEW(q); adjlisti.firstarc.nextarc:=q; q.adjvex:=P.rchild.data; q.nextarc:=NIL Others: adjlisti.firstarc:=NIL ENDC IF p.lchildNIL THEN ENQUEUE(Q,p.lchild); IF p.rchildNIL THEN ENQUEUE(Q,p.rchild) EN
26、DP;bt_to_adj 单选题3在有N个叶结点的哈夫曼树中,其结点总数为_。(1分) (1)不确定 (2)2N (3)2N+l (4)2N-1 答案:(4) 单选题6判断线索二叉树中某结点P有左孩子的条件是_。(1分) (1) P NIL (2)p1childnil (3)p1tag=O (4)prtag=l答案:(3) 单选题7已知二叉树中叶结点数为50,仅有一个孩子的结点数为30,则总结点数为_。(1分) (1) 81 (2) 129 (3) 110 (4) 120 答案:(2) 解答题1一棵二叉数的先序、中序和后序如下,其中有部分未标出,试构造出该二叉树。(5分) 先序序列为: ABC
27、DEFGHIJK 中序序列为: CBEDFAHJKIG 后序序列为: CEFDBKJIHGA 算法题1修改下面中序遍利二叉树的算法,使其能判定所输出的序列是否有序。(9分) PROC inorder(bt:bitrep); bt为二叉树根结点指针 IF btnil THEN inorder(bt1child); visit(btdata); inorder(btrchild) ENDP;inorder算法:思想:用一个变量predata作为前趋结点的值,初值为最小值Maxint,遍历中判断,当某结点的值小于其前趋时,输出序列为无序列,逻辑变量B为False。 PROC inorder(bt:b
28、itreptr); bt为二叉树根结点指针,初次调用时predata=Maxint,B为true, IF btnil THEN inorder(bt.lchild); IF bt.datapredata THEN B:=False; Predata:=bt.data; Inorder(bt.rchild) ENDP;inorder 算法题2修改下面层次遍利二叉树的算法使其能判断该二叉树是否为完全二叉树。 (8分) PROC level(bt:bitreptr); IF btnil THENINITQUEUE(Q);ENQUEUE(Q,bt);初始化队列Q,并将根入队列 WHILE NOT EMPTY(Q) DO队列非空进入循环 p:=DEQUEUE(Q);出队列 visit(pdata); IF p.1child nil THEN ENQUEUE(Q,p1child);IF p.rchild nil THEN ENQUEUE(Q,prchild);ENDP;level算法思想:完全二叉树中,若某结点无左孩子,也不能有右孩子;若某结点缺少孩子,其后的所有结点就不能有右孩子。参考思想: 一旦出现“无左有右”则为非完全树第一次出现(“无左
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1