[p:
=p↑.next;j:
=j+1];
IF(p=nilORj>i-1)
THENERROR(‘i’)
ELSE[new(s);s↑.data:
=b;
s↑.next:
=p↑.next;
p↑.next:
=s]
解答题4.试设计一种链队列的存储结构,要求只用一个指针,并且使其插入和删除的时间复杂度均为O
(1)。
试画出存储结构,并指出队首和队尾。
(5分)
解答:
采用仅有尾指针rear的循环单链表表示队列(如图),队空时rear=nil,
队首的第一个结点(front=rear↑.next),队尾为最后一个结点(rear)。
填空题5.在数据结构中,从逻辑上可以把数据结构分为线性结构和非线性结构。
(2分)
算法题2.设双端链表结构如下;头结点有俩个域,其中:
firstlink指向第一个数据结点,lastlink
指向最后一个数据结点,链表空时,firstlink=lastlink=NIL。
阅读下面的算法,用适当的语句完成各画线的处理,使其能实现删除链表中的data域为x的所有结点功能。
(10分)
PROCDELETE(L,x);
p:
=L↑.firstlink;
q:
=L;
WHILEp<>NILDO
[IFp↑.data=xTHEN
CASE
L=q:
{第一个结点为x和只有一个结点且为x的处理}
L↑.1astlink=p:
{最后一个为x的处理}
Others:
{其它结点为x的处理}
ENDC
ELSE{不为x的处理}
]
ENDP;{DELETE}
算法:
PROCDELETE(L,x);
p:
=L↑.firstlink;
q=L;
WHILEp<>NILDO
[IFp↑.data=xTHEN
CASE
L=q:
[L↑firstlink:
=p↑.link;
IFp↑.link=NILTHENL↑.lastlink:
=NIL;p:
=p↑.link];
L↑.lastlink=p:
[L↑.lastlink:
=q;
q↑.link:
=p↑.link;p:
=p↑.link]
Others:
[q↑.link:
=p↑.1ink;p:
=p↑.link]
ENDC
ELSE[q:
=p;p:
=p↑.link]
]
ENDP;{DELETE}
算法题1、假设以下不带头结点的循环链表Q表示队列,并且只一个rear指针指向队尾元素结点,队列空时Q.rear=nil试编写相应的出队函数FUNCdelq(Q):
elem和队列操作addq(Q,elem)的算法.(10分)
算法:
PROCaddq(Q,elem);
New(p);P↑.data:
=elem:
(1分)
IFQ.rear=nilTHENp↑.link:
=p(1分)
ELSE[P↑.link:
=Q.rear↑.1ink;Q.rear↑.1ink:
=p;](2分)
Q.rear:
=p(1分)
ENDP;
FUNCdelq(Q):
elem:
IFQ.rear=NILTHENRETURN(NULL)(1分)
ELSE[p:
=Q.rear↑.link;(1分)
IFp=Q.rearTHENQ.rear:
=NIL//只有一个结点
ELSEQ.rear↑.link:
=p↑.link;(2分)
RETURN(p↑.data)](1分)
ENDF;
单项选择题10.循环链表的主要优点是()。
(1分)
A.已知某结点位置后能容易找到其直接前趋
B.在进行插入、删除元素时能保证链表不断开
C.不再需要头指针
D.从表中任一个结点出发都能扫描整个链表
答案:
D
填空题1.线性表、栈和队列都是线性结构,可以在线性表的任何位置插入和删除元素:
而栈只能在栈顶插入和删除元素;对于队列只能在队尾插入元素、在队首删除元素。
(5分)
简答题4.线性表有哪两种存储结构?
在这两种存储结构中元素之间的逻辑关系分别是通过什么决定的?
(5分)
答:
有顺序和链式两种存储结构,顺序结构中元素之间的逻辑关系由物理存储位置决定,链式结构中元素之间的逻辑关系由链指针决定。
算法题1、试编写算法,将一个带头结点的单循环链表A,按结点值分解为奇数和偶数两个具有相同结构的链表A和C,其中C的结点是原A中结点值为偶数的结点。
要求利用原链表的结点。
可用ODD(p↑.data)逻辑函数判断指针p的值data是否为奇数,是则返回true。
(9分)
PROCODDEVEN(1a,lc:
link);
New(lc);pc:
=lc;//建C的头结点
P:
=la↑.next;Q:
=la;
WHILEP<>laDO
IFODD(P↑.data)
THEN[Q:
=P;P:
=P↑.next]
ELSE[Q↑.next:
=P↑.next;//删除
pc↑.next:
=P;pc:
=P;//插入
P:
=Q↑.next];
pc↑.next:
=lc//lc成循环链
ENDP;{ODD_EVEN}
【经典考题】数据结构是研究数据的和,以及它们之间的相互关系,并对这种结构定义相应的,设计出相应的,而确保经过这些运算后所得到的新结构是结构类型。
解:
本部分基本上都是概念试题。
参考答案依次为:
物理结构、逻辑结构、运算、算法、原来的。
【经典考题】在数据结构中,与所使用的计算机无关的数据叫A结构:
链表是一种采用B存储结构存储的线性表;链表适用于C查找;在链表中进行D操作的效率比在顺序存储结构中进行D操作效率高;二分查找E存储结构。
供选择的答案:
A)①存储②物理③逻辑④物理和逻辑
B)①顺序②网状③星式④链式
C)①顺序②二分法③顺序,也能二分法④随机
D)①二分法查找②快速查找③顺序查找④插入
E)①只适用于链式②只适用于顺序③既适用于顺序也适用于链式
④既不适用于顺序也不适用于链式
解:
本题旨在考察基本的概念。
答案为:
A)③;B)④;C)①;D)④;E)②。
【经典考题】在双向链表存储结构中,删除P所指的结点时,需修改指针()。
A)(P->llink)->rlink=P->rlinkB)P->llink=(P->llink)->llink
(P->rlink)->llink=P->llink((P->llink)->llink)—>rlink=P
C)((P->llink)->llink)->rlink=PD)((P->rlink)->rlink)->llink=P
P->llink=(P->llink)->llinkP->rlink=(P->rlink)->rlink
解:
答案为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->Prior=S;
(2)(L==L->Next)&&(L==L->Pnor)考虑不带头结点的双向循环链表L为空表的条件?
【经典考题】将两个各有n个元素的有序表归并成一个有序表,其最少的比较次数是()。
A)nB)2n-1C)2nD)n-1
解:
答案为A)
〖栈和队列〗
解答题3、设循环队列cq的队首指针为front,队尾指针为rear,队列可容纳的最大元素个数为max,分别用下列三种方法来区分队满或队空,试在表中写入相应的处理。
(5分)
用记数变量C记载元素个数
用标志位
牺牲一个元素的存储单元
初始空队列各变量初值
cq.fornt:
=cq.rear:
=0C:
=0
cq.fornt:
=cq.rear:
=0tag:
=0
cq.fornt:
=cq.rear:
=0
出队前判队空条件
C=0
tag=0ANDcq.fornt=cq.rear
cq.fornt=cq.rear
入队前判队满条件
C=max
tag=1ANDcq.fornt=cq.rear
(cq.rear+1)%max=cq.front
出队时该方法的特殊处理
cq.fornt:
=(cq.fornt+1)%max
C:
=C-1
cq.fornt:
=(cq.fornt+1)%max
IFcq.front=cq.rearTHEN
Tag:
=0
cq.fornt:
=(cq.front+1)%max
入队时该方法的特殊处理
cq.rear:
=(cq.rear+1)%maxC:
=C+1
cq.rear:
=(cq.rear+1)%max
IFcq.front=cq.rearTHEN
Tag:
=1
cq.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分)
-m01n
top1=front←S1
S2→top2=rear
PROCadd(x:
elementype)
{将x插入到队尾中}
IFtop2=nTHENERROR(‘队满’)
ELSE[top2:
=top2+1;
IFtop2>0THENS2[top2]:
=xELSES1[top2]:
=x]
ENDP;{add}
PROCdelete(varx:
elementype)
{删除队首元素,并赋给x}
IFtop1>top2THENERROR(‘队空’)
ELSE[IFtop1<1THENx:
=S1[top1]ELSEx:
=S2[top1];
top1:
=top1+1]
ENDP;{delete}
【经典考题】一般情况下,将递归算法转换成等价的非递归算法应该设置()。
A)栈B)队列C)堆栈或队列D)数组
解:
栈的用途之一就是将递归转换为非递归,选择A)。
【经典考题】若一个栈的输入序列是1,2,3,…,n,输出序列的第一个元素是n,
则第i个输出元素是()。
A)n-iB)n-i+1C)iD)n-i-1
解:
答案为B)。
【经典考题】在用一维数组sequ[0…m-1]存储循环队列的元素时,怎样另设一个标志tag来区分尾指针(rear)和头指针(front)相等时队列的状态是“空”还是“满”?
解:
设标志tag的初始值为“0”,如果由于元素入队列使得rear==front时,则置tag为“1”:
反之,如果由于元素出队列使得rear==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)只有一个根结点的二叉树和左单枝二叉树;(2分)
(3)只有一个根结点的二叉树;(1分)
算法题2.试编写将二叉树转换成树林的算法(10分)。
设树林的各棵树用带头结点的单连表连接。
连表头指针为F,连表结点结构为rootlink和nextlink,其中rootlink为指向树林中某棵树的根的指针,nextlink为指向下一棵树的指针,二叉树的结点结构为:
lchild,data,rchild.过程定义如下:
PROCBttoForest(bt:
bittrepit,F:
linklist)
ENDP;{BttoForest}
算法:
PROCBttoForest(bt:
bittrepit,F:
linklist)
New(s):
F=s;//树林单链表头结点
p:
=bt;
WHILEp<>NILDO
[new(q);q↑.rootlink=p;//建树林单链表结点
p:
=p↑.rchild;
q↑.rootlink↑.rchild:
=NIL;//把一棵树分离出,P已指向下一棵的树根
s↑.nextlink:
=q;s:
=q];//树林单链表结点进链
s↑.nextlink:
=NIL
ENDP;{BttoForest}
解答题5、对二叉树回答下列问题(5分)
(1)在先序、中序和后序遍历结果中,那些结点的相应次序不发生改变?
(2)若中序遍历某二叉树得到一个结点值递增的有序序列,则该二叉树为排序二叉树。
该判断是否正确?
为什么?
(3)设二树中无度为1的结点,试用叶结点数表示二叉村的结点数。
解答:
(1)叶结点
(2)正确
(3)2n0-1
算法题2、试编写将用二叉链表表示的具有N个结点的二叉树转换成用邻接存储二叉树的算法。
(10分)
设二叉链表的结点结构为:
lchild
data
rchild
邻接点的头接点数组为adjlist(l:
n),数组结构为:
datafirstarcadjvexnextarc
并假设算法中可以直接使用以下队列操作:
初始化操作:
INITQUEUE(Q)
判队空函数:
EMPTY(Q)
入队操作:
ENQUEUE(Q,X)
出队操作:
DLQUEUE(Q)
PROCbt_to_adj(bt:
bitreptr;n:
integer;adjlist:
ARRAY[n]OFvexnode):
{bt为二叉树的根,n为结点数,adjlist为邻接表头接点数组}
参考算法:
INITQUEUE(Q);
i:
=1;
ENQUEUE(Q,bt);//树根进队
WHILEi[p:
=DLQUEUE(Q);//位置i存进设二叉链表的结点data域,
adjlist[i].data:
=p↑.data;p↑.data:
=i;i:
=i+1;
IFp↑.lchild<>NILTHENENQUEUE(Q,p↑.lchild);
IFp↑.rchild<>NILTHENENQUEUE(Q,p↑.rchild)
]
i:
=1;
WHILEi[p:
=DLQUEUE(Q);//位置i,存入adjvex
CASE
p↑.lchild<>NILANDp↑.rchild=NIL:
[NEW(q);adjlist[i].firstarc:
=q;
q↑.adjvex:
=P↑.lchild↑.data;
q↑.nextarc:
=NIL]
p↑.lchild=NILANDp↑.rchild<>NIL:
[NEW(q);adjlist[i].firstarc:
=q;
q↑.adjvex:
=P↑.rchild↑.data;
q↑.nextarc:
=NIL]
p↑.lchild<>NILANDp↑.rchild<>NIL:
[NEW(q);adjlist[i].firstarc:
=q;
q↑.adjvex:
=P↑.lchild↑.data;
NEW(q);adjlist[i].firstarc↑.nextarc:
=q;
q↑.adjvex:
=P↑.rchild↑.data;
q↑.nextarc:
=NIL]
Others:
adjlist[i].firstarc:
=NIL
ENDC
IFp↑.lchild<>NILTHENENQUEUE(Q,p↑.lchild);
IFp↑.rchild<>NILTHENENQUEUE(Q,p↑.rchild)
]
ENDP;{bt_to_adj}
单选题3.在有N个叶结点的哈夫曼树中,其结点总数为______。
(1分)
(1)不确定
(2)2N(3)2N+l(4)2N-1
答案:
(4)
单选题6.判断线索二叉树中某结点P有左孩子的条件是_____。
(1分)
(1)P<>NIL
(2)p↑.1child<>nil(3)p↑.1tag=O(4)p↑.rtag=l
答案:
(3)
单选题7.已知二叉树中叶结点数为50,仅有一个孩子的结点数为30,则总结点数为____。
(1分)
(1)81
(2)129(3)110(4)120
答案:
(2)
解答题1.一棵二叉数的先序、中序和后序如下,其中有部分未标出,试构造出该二叉树。
(5分)
先序序列为:
ABCDEFGHIJK
中序序列为:
CBEDFAHJKIG
后序序列为:
CEFDBKJIHGA
算法题1.修改下面中序遍利二叉树的算法,使其能判定所输出的序列是否有序。
(9分)
PROCinorder(bt:
bitrep);
{bt为二叉树根结点指针}
IFbt<>nilTHEN
[inorder(bt↑.1child);
visit(bt↑.data);
inorder(bt↑.rchild)
]
ENDP;{inorder}
算法:
思想:
用一个变量predata作为前趋结点的值,初值为最小值Maxint,遍历中判断,当某结点的值小于其前趋时,输出序列为无序列,逻辑变量B为False。
PROCinorder(bt:
bitreptr);
{bt为二叉树根结点指针,初次调用时predata=Maxint,B为true,}
IFbt<>nilTHEN
[inorder(bt↑.lchild);
IFbt↑.data=False;
Predata:
=bt↑.data;
Inorder(bt↑.rchild)
]
ENDP;{inorder}
算法题2.修改下面层次遍利二叉树的算法使其能判断该二叉树是否为完全二叉树。
(8分)
PROClevel(bt:
bitreptr);
IFbt<>nilTHEN
[INITQUEUE(Q);ENQUEUE(Q,bt);{初始化队列Q,并将根入队列}
WHILENOTEMPTY(Q)DO{队列非空进入循环}
[p:
=DEQUEUE(Q);{出队列}
visit(p↑.data);
IFp↑.1child<>nilTHENENQUEUE(Q,p↑.1child);
IFp↑.rchild<>nilTHENENQUEUE(Q,p↑.rchild);]
]
ENDP;{level}
算法思想:
完全二叉树中,若某结点无左孩子,也不能有右孩子;若某结点缺少孩子,其后的所有结点就不能有右孩子。
参考思想:
一旦出现“无左有右”——则为非完全树
第一次出现(“无左