数据结构练习题201X级参考答案文档格式.docx
- 文档编号:18529244
- 上传时间:2022-12-19
- 格式:DOCX
- 页数:31
- 大小:313.26KB
数据结构练习题201X级参考答案文档格式.docx
《数据结构练习题201X级参考答案文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构练习题201X级参考答案文档格式.docx(31页珍藏版)》请在冰豆网上搜索。
可有若干个开始结点和终端结点,其余的内部结点可以有若干个前趋结点和若干个后继结点。
1.13简述各种常用存储方法的基本思想。
各种方法的基本思想:
顺序存储:
逻辑上相邻的数据元素存储在物理位置上相邻的存储单元里。
链接存储:
通过附加指针域表示数据元素之间的关系。
索引存储:
除了存储数据元素,还要建立附加的索引表来标识数据元素的地址。
散列存储:
根据关键字直接计算出该结点的存储地址,通常称为关键字-地址转换法。
选择题:
2.1线性表L=(ai,aa,…,an),下列说法正确的是:
A.每个元素都有一个直接前驱和一个直接后继。
B.线性表中至少有一个元素。
C.表中元素的排列顺序必须是由小到大或由大到小。
D.除第一个和最后一个元素外,其余每个元素都有且仅有一个直接前驱和一个直接后继。
2.2下面关于线性表的叙述中,错误的是:
C.s=L;
s->
next=L;
D.s->
s=L;
2.7已知单链表上一结点的指针为p,则在该结点之后插入新结点*s的正确操作语句为:
A.p->
next=s;
next=p->
next;
B.s->
p->
C.p->
next=s->
D.p->
2.8已知单链表上一结点的指针为p,则删除该结点后继的正确操作语句是:
A.s=p->
p=p->
free(s);
B.p=p->
free(p);
C.s=p->
D.p=p->
free(p->
next);
2.9设一个链表最常用的操作是在表尾插入结点和在表头删除结点,则选用下列哪种存储结构效率最高?
A.单链表B.双链表C.单循环链表D.带尾指针的单循环链表
2.10线性表的链接存储结构是一种()存储结构。
D.散列存取
A.随机存取B.顺序存取C.索引存取
2.11链表不具备的特点是:
填空题:
2.1在单链表L中,指针p所指结点有后继结点的条件是p->
next!
=NULL。
2.2判断带头结点的单链表L为空的条件L->
next==NULL。
—'
2.12顺序表和链表中能实现随机存取的是顺序表,插入、删除操作效率高的是链表—。
2.13对于一个具有n个结点的单链表,已知一个结点的指针p,在其后插入一个新结点的时间复杂度为
O
(1);
若已知一个结点的值为x,在其后插入一个新结点的时间复杂度为_0(n)。
2.14顺序表的存储密度大_,链表的存储密度小一。
2.15比较顺序表和链表这两种线性表不同存储结构的特点
顺序表
存储密度大
存储空间连续
静态分配
随机存取
插、删效率低
链表
存储空间可不连续
动态分配
顺序存取
插、删效率高
2.16简述头结点的作用。
头结点的作用是使得单链表在表头位置的插、删操作同中间位置的插、删操作完全相同。
即使“空表”与“非空表”的操作统一,也使“表头结点”与其他位置结点的操作完全一致,无须特殊处理。
2.17写岀单链表存储结构的C语言描述。
typedefintDataType;
typedefstructNode
{DataTypedata;
structNode*next;
}LinkList;
完善程序题:
2.18设计一个算法,其功能为:
向一个带头结点的有序单链表(从小到大有序)中插入一个元素X,使插
入后链表仍然有序。
请将代码补充完整。
;
/*定义指向该结构类型的指针变量next*/
}Linklist;
voidinsert(Linklist*L,DataTypex)
{Linklist*s,*p=L;
while(p->
next&
&
next->
data<
x)
/*p指针后移一步*/
/*申请一个新结点空间,将其地址赋给变量s*/s->
data=x;
;
/*将*s结点插入到*p结点的后面*/
}
structNode
I*next;
p=p->
next;
s=(LinkList*)malloc(sizeof(LinkList));
s->
next=p->
p->
next=s;
2.19设计一个函数功能为:
在带头结点的单链表中删除值最小的元素。
typedefNode/*定义结构体类型*/
structNode*next;
}LinkList;
voiddeleteMin(LinkList*L)
{LinkList*p=L->
next,*q;
/*首先查找值最小的元素,指针q指向最小元素结点*/
q=p;
while(p)
{if(p->
data<
q->
data)
/*p指针后移一步,比较单链表中的每一个结点*/
if(!
q)return;
/*不存在最小结点(空表)时,直接退出*/
p=L;
/*若存在最小结点,则先找到最小结点的前驱,即*q的前驱*/
while()
/*从单链表中删除最小元素结点(指针q所指结点)*/;
/*释放指针q所指结点的空间*/
struct
p=p>
p>
next!
=q
next=q>
free(q);
算法设计题:
2.20已知长度为n的线性表A中的元素是整数,写算法求线性表中值大于item的元素个数。
分两种情况
编写函数:
(1)线性表采用顺序存储;
(2)线性表采用单链表存储。
(1)线性表采用顺序存储
#defineMAX1024
typedefstruct
{DataTypedata[MAX];
intlast;
}SeqList;
intLocateElem(SeqList*L,DataTypeitem)
{inti,j=0;
for(i=0;
i<
=L->
last;
i++)
if(L->
data[i]>
item)j++;
returnj;
(2)线性表采用单链表存储
structNode*next;
}LinkList;
intlocateElem(LinkList*L,DataType{LinkList*p=L->
next;
inti=0;
while(p)
if(p->
data>
item)i++;
returni;
item)
2.21试写一算法实现对不带头结点的单链表H进行就地(不额外增加空间)逆置
typedefstructNode
LinkList*Reverse(LinkList*L)
{LinkList*p,*q;
if(!
L)return;
p=H_>
q=H_>
while(q)
{q=q_>
p_>
next=L;
L->
next=NULL;
L=p;
p=q;
returnL;
3.1设一个栈的输入序列是1,2,3,4,5,则下列序列中,是栈的合法输岀序列的是:
A.51234B.45132C.43215D.35241
3.2设有一顺序栈,元素1,2,3,4,5依次进栈,如果出栈顺序是2,4,3,5,1则栈的容量至少是:
A.1B.2C.3D.4
3.3若用一个大小为6的数组来实现循环队列,且当前rear和front的值分别为0和3,当入队一个元素,再出队两个元素后,rear和front的值分别为:
A.1和5B.2和4C.4和2D.5和1
3.4栈和队列都是操作受限的线性表,栈的运算特点是LIFO,队列的运算特点是」FIFO-。
3.5若序列a、b、c、d、e按顺序入栈,假设P表示入栈操作,S表示出栈操作,则操作序列PSPPSPSPSS
后得到的输出序列为acdeb。
3.6已知一个顺序栈*s,栈顶指针是top,它的容量为MAXSIZE,则判断栈空的条件为s->
top==-1_,
栈满的条件是s->
top==MAXSIZE-1。
3.7对于队列来说,允许进行删除的一端称为队头,允许进行插入的一端称为队尾。
3.8某循环队列的容量MAXSIZE=6,队头指针front=3,队尾指针rear=0,则该队列有_3_个元素。
3.9栈上的基本运算有哪些?
栈的基本运算有:
(1)初始化栈initStack(s):
构造了一个空栈&
(2)判栈空empty(s):
若栈s为空栈,返回值为“真”
(1),否则返回值为“假”(0)。
(3)入栈push(s,x):
在栈s的顶部插入一个新元素x,x成为新的栈顶元素。
(4)出栈pop(s):
删除栈s的栈顶元素。
(5)读栈顶元素top(s):
栈顶元素作为结果返回,不改变栈的状态。
3.10循环顺序队列的存储结构图示及C语言描述?
循环顺序队列图示:
C语言描述:
#defineMAXSIZE1024
{DataTypedata[MAXSIZE];
intrear,front;
}SeQueue;
SeQueue*sq;
3.11简述栈和队列有哪些联系与区别?
栈和队列都是运算运算受限的线性表,逻辑结构相同;
都可以顺序存储和链接存储,存储结构也相同;
插入和删除运算都限制在线性表的表端完成,且不需要查找运算。
二者差别主要体现在运算的限制不同:
栈是后进先出(LIFO)的线性表,限制它的插入和删除操作仅在表的一端进行。
队列是先进先出(FIFO)的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。
3.12通常称正读和反读都相同的字符序列为“回文”,例如,“abcdeedcba”、“abcdcba"
是回文。
若
字符序列存储在一个单链表中,编写算法判断此字符序列是否为回文。
(提示:
将一半字符先依次进
栈)
#definemaxsize100
typedefchardatatype1;
{datatype1data[maxsize];
inttop;
}seqstack;
typedefintdatatype;
typedefstructnode
{datatypedata;
structnode*next;
}Linklist;
Duichen(Linklist*head)
{inti=1;
Linklist*p;
seqstack*s;
s=initSeqStack();
p=head->
next;
n=0;
while(p){n++;
}p=head->
while(i<
=n/2)
{push(s,p->
data);
i++;
}
if(n%2!
=0)p=p->
while(p&
data==pop(s))p=p->
if(p)return0elsereturn1;
5.1设数据结构D-S可以用二元组表示为D-S=(D,S),r匕S,其中:
D={A,B,C,D},
r={<A,B>,<A,C>,<B,D>},则数据结构D-S是:
5.4
深度为10的完全二叉树,第
3层上的的结点数是:
A.15B.16
C.4
D.32
5.5
设一棵树的度为
4,
其中度为
1、2、3、4的结点个数分别为6、3、2、1,则这棵树中叶子结点的个
数为:
A.8B.9
C.10
D.11
5.6
对于二叉树来说,
第
i层上最多包含的结点个数为:
A.2i-1
B.
2i+1
C.2iD.2i
5.7树的后根遍历序列等同于与该树对应的二叉树的哪种序列?
A.前序序列B.中序序列C.后序序列D.层序序列
5.8设森林F中有三棵树,第一,第二,第三棵树的结点个数分别为M1,M2和M3。
与森林F对应的二叉
树根结点的右子树上的结点个数是:
A.M1B.M1+M2C.M3D.M2+M3
5.9二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是11。
5.10包含n个结点的二叉树,高度最大为n,高度最小为log2n1o
5.11某完全二叉树共有200个结点,则该二叉树中有1个度为1的结点。
5.12一棵高度为10的满二叉树中的结点总数为210-1个,其中叶子结点数为29o
5.13某完全二叉树结点按层顺序编号(根结点的编号是1),若21号结点有左孩子结点,则它的左孩子结点的编号为42o
5.14深度为k的完全二叉树至少有2k-1个结点,至多有
5.15n个结点的线索二叉树上含有n+1条线索。
5.16画出包含三个结点的树和二叉树的所有不同形态。
5.17找出满足下面条件的二叉树:
(1)前序遍历与中序遍历结果相同:
只有右分支的单分支二叉树
(2)前序遍历和后序遍历结果相同:
只有一个根结点的二叉树
(3)中序遍历和后序遍历结果相同:
只有左分支的单分支二叉树
5.18一棵二叉树的中序、后序遍历序列分别为:
GLDHBEIACJFK和LGHDIEBJKFCA,请
回答:
(1)画岀二叉树逻辑结构的图示。
(2)画岀此二叉树的二叉链表存储结构的图示并给岀C语言描述。
(3)画岀上题中二叉树的中序线索二叉树。
(4)画岀中序线索二叉链表存储结构图示并给岀C语言描述。
(1)二叉树的逻辑结构图示:
(2)二叉链表存储结构的图示及C语言描述:
root
A
\
C
iL
I
电
D
]
F
,/
j
丄
H
J1
K
typedefcharDataType;
typedefstructNode{DataTypedata;
structNode*lchild,*rchild;
}BiTree;
(3)中序线索二叉树:
L
(4)
中序线索二叉链表的图示及C语言描述:
intltag,rtag;
}BiThrTree;
5.19设有森林如图5.31所示,请回答:
(1)画岀与该森林对应的二叉树的逻辑结构图示
(2)
写岀该二叉树的前序、中序、后序遍历序列
图5.31
(1)二叉树的逻辑结构图示:
(2)前序遍历序列:
中序遍历序列:
后序遍历序列:
ABCDFGEH,
ADGFCBHE
GFDCHEBA
GA
1
A1
*
E
If
■
、
1D0
(3)中序线索二叉链表的图示及
/
E1A
整理文档
C语言描述:
请回答:
intltag,rtag;
5.20设有森林B=(D,S),
D={A,B,C,D,E,F,G,H,I,J},r€Sr={vA,B>
vA,C>
<
A,D>
vB,E>
vC,F>
vG,H>
vG,l>
v|,J>
(1)画岀与森林对应的二叉树的逻辑结构图示。
(2)写岀此二叉树的前序、中序、后序遍历序列。
(3)画岀此二叉树的二叉链表存储结构的图示并给岀C语言描述。
(1)
与森林对应的二叉树的逻辑结构图示:
(2)前序遍历序列:
ABECFDGHIJ,中序遍历序列:
EBFCDAHJIG后序遍历序列:
EFDCBJIHGA
(3)二叉链表存储结构的图示及
}BiTree;
B
(d)
(a)(b)
(c)
图5.32
(b)
(c)
(Fo
{a,b,c,d,e,f,g,h}中的字母构成,这8个字母在电文中出现的
概率分别为{0.07,0.19,0.02,0.060.32,0.030.21,0.10},试为这8个字母进行哈夫曼编码。
请回
(3)哈夫曼树的带权路径长度WPL:
n
WPLWjlj
i1
=0.07X4+0.19X2+0.02X5+0.06X4+0.32X2+0.03X5+0.21X2+0.10X4=2.61完善程序题:
5.23设计一个算法,其功能为:
利用中序线索求结点的中序后继。
structNode*lchild,;
BiThrTree*InOrderNext(BiThrTree*p)/*求中序后继*/
{if()p=p->
rchild;
/*若结点*p无右孩子*/
else{/*若结点*p有右孩子*/
ltag==0)
return
p
rchild
)->
rtag==1
lchild
)
6.1n个顶点的有向图中有向边的数目最多为:
A.n-1B.nC.n(n-1)/2D.n(n-1)
6.2下面哪一方法可以判断出一个有向图是否有环(回路):
A.深度优先遍历B.求最短路径C.拓扑排序D.广度优先遍历
6.3某无向图的邻接矩阵如下所示,则该图中有9条边,有6个顶点
010101
101011
A=
010001
100011
010100
111100
6.4在无向图的邻接矩阵存储结构中,第i列上非零元素的个数是顶点vi的度,而在有向图的邻接
矩阵中,第i列上非零元素的个数是顶点vi的入度。
6.5若无向图采用邻接矩阵存储,则存储空间的大小只与图中顶点一的个数有关。
6.6对于一个具有n个顶点和e条边的连通图,其生成树中的顶点数和边数分别为_』n和n-1。
6.7设一个有向图为G=(V,E),其中V={v1,V2,V3,V4},E={<
v2,V1>
vV2,V3>
v4,V1>
v1,V4>
vV4,V2>
},请回答下列各问:
(1)画岀该有向图,求岀每个顶点的入度和岀度
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 练习题 201 参考答案