数据结构第4版习题及实验参考答案 数据结构复习资料完整版c语言版文档格式.docx
《数据结构第4版习题及实验参考答案 数据结构复习资料完整版c语言版文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构第4版习题及实验参考答案 数据结构复习资料完整版c语言版文档格式.docx(64页珍藏版)》请在冰豆网上搜索。
p—〉next=s;
C、s-〉next=p-〉next;
p=s;
D、p->next=s;
s-〉next=p;
11、在一个单链表中,已知q是p的前趋结点,若在q和p之间插入结点s,则执行(C)
A、s-〉next=p-〉next;
p-〉next=s;
B、p-〉next=s->
next;
s->
next=p;
C、q—〉next=s;
next=p;
D、p—>next=s;
s—〉next=q;
12、在线性结构中,第一个结点没有前趋结点,其余每个结点有且只有1 个前趋结点.
栈和队列
1、在栈操作中,输入序列为(A,B,C,D),不可能得到的输出数列是(D )
A、(A,B,C,D) B、(D,C,B,A)
C、(A,C,D,B) D、(C,A,D,B)
2、设栈ST用顺序存储结构表示,则栈ST为空的条件(B)
A、ST。
top=ST.base<
>
0 B、ST.top=ST.base==0
C、ST。
top=ST.base<
〉n D、ST.top=ST.base==n
3、向一个栈顶指针为HS的链栈中插入一个s结点时,执行( C )
A、HS-〉next=s;
B、s->
next=HS->
next;
HS->
next=s;
C、s->next=HS;
HS=S;
D、s—>
next=HS;
HS=HS-〉next;
4、从一个栈顶指针为HS的链栈中删除一个结点,用x保存被删结点的值,则执行(C)
A、x=HS;
HS=HS—>
B、HS=HS->next;
x=HS->data;
C、x=HS->data;
HS=HS-〉next;
D、s-〉next=HS;
HS=HS->next;
5、用单链表表示的链示队列的队头在链表的( A)位置。
A、链头 B、链尾 C、链中
6、判定一个链队列Q(最多元素个数为n)为空的条件是( A )
A、Q。
front==Q.rearB、Q。
front!
=Q.rear
C、Q.front==(Q.rear+1)%n D、Q。
front!
=(Q。
rear+1)%n
7、在链队列Q中,插入要所指结点需顺序执行的指令是( B)
A、Q.front->
next=s;
f=s;
B、Q.rear—〉next=s;
Q。
rear=s;
C、s—>
next=Q。
rear;
Q.rear=s;
D、s—>next=Q.front;
front=s;
8、在一个链队列Q中,删除一个结点需要执行的指令是( C)
A、Q。
rear=Q.front->
next;
B、Q.rear->
next=Q.rear—〉next->next;
C、Q.front-〉next=Q.front->next->next;
D、Q。
front=Q。
rear->next;
9、栈和队列的共同点(C )
A、都是先进后出
B、都是先进先出
C、只允许在端点处插入和删除元素
D、没有共同点
10、栈的特点是_先进后出,队列的特点是先进先出
11、线性表、栈和队列都是线性结构,可以在线性表的任何位置插入和删除元素;
对于栈只能在栈顶插入和删除元素;
对于队列只能在队尾插入元素和在队首删除元素.
串和数组
1、设串s1=’ABCDEFG’,s2=’PQRST’,函数Concat(x,y)返回x和y串的连接串,Substr(s,I,j)返回串s从序号i开始的j个字符组成的子串,length(s)返回串s的长度,则Concat(Substr(s1,2,length(s2), Substr(s1,length(s2),2))的结果串是( D )
A、BCDEFB、BCDEFG C、BCPQRST D、BCDEFEF
2、串是一种特殊的线性表,其特殊性体现在( D )
A、可以顺序存储 B、数据元素是一个字符
C、可以链接存储 D、数据元素可以是多个字符
3、设有两个串p和q,求q在p中首次出现的位置的运算称作( B )
A、连接 B、模式匹配 C、求子串联 D、求串长
4、串的两种最基本的存储方式是顺序存储方式和链接存储方式。
树和二叉树
1、树最合适用来表示( B )
A、有序数据元素 B、元素之间具有分支层次关系的数据
C、无序数据元素 D、元素之间无联系的数据
2、按照二叉树的定义,具有3个结点的二叉树有( C )种。
A、3 B、4 C、5 D、6
3、在一棵有n个结点的二叉树中,若度为2的结点数为n2,度为1的结点数为n1,度为0的结点数为n0,则树的最大高度为(E ),其叶结点数为( G);
树的最小高度为( B ),其叶结点数为( G );
若采用链表存储结构,则有( I)个空链域。
A、n/2 B、[log2n]+1C、log2n D、nE、n0+n1+n2F、n1+n2
G、n2+1H、1 I、n+1 J、n1 K、n2 L、n1+1
4、在一棵二叉树上第5层的结点数最多为( B)。
(假设根结点的层数为0)
A、8 B、16 C、15D、32
5、深度为5的二叉树至多有( C )个结点.
A、16 B、32 C、31D、10
6、在一非空二叉树的中序遍历序列中,根结点的右边( A )
A、只有右子树上的所有结点B、只有右子树上的部分结点
C、只有左子树上的部分结点D、只有左子树上的所有结点
7、一棵完全二叉树按层次遍历的序列为ABCDEFGHI,则在先序遍历中结点E的直接前趋为(D ),后序遍历中结点B的直接后继是( E )。
A、B B、D C、A D、IE、F F、C
8、已知某二叉树的后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是( D)
A、acbedB、decabC、deabcD、cedba
9、在树形结构中,树根结点没有___前趋________结点,其余每个结点有且只有_______1______个前趋结点;
叶子结点没有______后继___________结点,其余每个结点的后继结点可以__任意多个____。
10、有一棵树如图所示,回答下面的问题:
这棵树的根结点是____K1_______,这棵树的叶子结点是__K2,K5,K7,K4______;
结点k3的度是____2________;
这棵树的度为___3_______;
这棵树的深度是_____4_________;
结点k3的子女是______K5,K6_____;
结点k3的父结点是_____K1_________.
11、已知一棵二叉树的中序遍历序列为CDBAEGF,前序遍历序列为ABCDEFG,试问能不能惟一确定一棵二叉树,若能请画出该二叉树.若给定前序遍历序列和后序遍历序列,能否惟一确定一棵二叉树,说明理由。
答:
由中序遍历序列和前序遍历序列或中序遍历序列和后序遍历序列可以惟一确定一棵二叉树。
基本思想是前序(后序)定根,中序分左右。
对于给定的前序和中序序列。
可确定根结点为A,以A为根的左子树结点为B,C,D,右子树结点为E,F,G。
进一步可确定所有子树的根结点,因而也就确定了整个二叉树。
对应的二叉树如图所示:
由前序遍历和后序遍历序列不能惟一确定一棵二叉树。
如图所示为4棵不同的二叉树,它们的前序遍历序列都是ABC,而后序遍历序列都是CBA。
12、设二叉树bt的存储结构如下:
1
2
3
4
5
6
7
8
9
10
left
data
j
h
f
d
b
a
c
e
g
i
right
0
其中bt为树根结点指针,left,right分别为结点的左右孩子指针域,data为结点的数据域,请完成下列各题:
⑴画出二叉树bt的逻辑结构
写出按前序、中序和后序遍历二叉树bt所得到的结点序列。
答:
二叉树bt的逻辑结构如图所示:
前序遍历:
abcedfhgij
中序遍历:
ecbhfdjiga
后序遍历:
echfjigdba
13、给定一棵以二叉链表存储结构表示的二叉树,其根结点指针为T,试写出求二叉树的叶子数目的算法.
intCountLeaf(BiTreeT){
//返回指针T所指二叉树中所有叶子结点个数
if(!
T) return0;
if(!
T->
lchild&
&!
T->
rchild)return1;
else{
m= CountLeaf(T->
lchild);
n=CountLeaf( T—〉rchild);
return(m+n);
}//else
} //CountLeaf
14、给定一棵以二叉链表存储结构表示的二叉树,其根结点指针为T,试写出求二叉树的深度的算法。
intDepth(BiTreeT){ // 返回二叉树的深度
if(!
T) depthval= 0;
else {
depthLeft= Depth(T-〉lchild );
depthRight= Depth( T->
rchild );
depthval =1 +(depthLeft>
depthRight?
depthLeft:
depthRight);
}
returndepthval;
}
图
1、一个有n个顶点的无向图最多有( C)条边。
A、n B、n(n-1) C、n(n-1)/2D、2n
2、具有6个顶点的无向图至少应有( A)条边才能确保是一个连通图。
A、5 B、6 C、7 D、8
3、存储稀疏图的数据结构常用的是( C)
A、邻接矩阵 B、三元组 C、邻接表D、十字链表
4、在有向图的邻接表存储结构中,顶点V在表结点中出现的次数是( C )
A、顶点V的度 B、顶点V的出度 C、顶点V的入度D、依附于顶点V的边数
5、用DFS遍历一个无环有向图,并在DFS算法退栈返回时,打印出相应的顶点,则输出的顶点序列是(A )
A、逆拓扑有序的 B、拓扑有序的 C、无序的
6、已知一个图如图所示,若从顶点a出发按深度优先搜索法进行遍历,则可能得到的一种顶点序列为( D),按广度优先搜索法进行遍历,则可能得到的一种顶点序列为( B)。
A、abecdf B、acfebd C、acebfd D、acfdeb
A、abcedf B、abcefdC、abedfc D、acfdeb
7、采用邻接表存储的图的广度优先搜索遍历算法类似于二叉树的(D)
A、中序遍历 B、先序遍历C、后序遍历 D、按层遍历
8、已知一个图如图所示,则由该图得到的一种拓扑序列为(A )
A、V1,V4,V6,V2,V5,V3 B、V1,V2,V3,V4,V5,V6
C、V1,V4,V2,V3,V6,V5 D、V1,V2,V4,V6,V3,V5
9、在图形结构中,每个结点的前趋结点数和后续结点数可以___任意多个_______。
10、在AOE网中,从源点到汇点各活动时间总和最长的路径称为关键路径。
11、给出图G,如图所示:
(1)给出图G的邻接表(画图即可)
(2)在你给出的邻接表的情况下,以顶点V4为根,画出图G的深度优先生成树和广度优先生成树。
(3)将你画出的广度优先生成树转换为对应的二叉树。
(1)图的邻接表如下图所示:
略
(2)以顶点V4为根的深度优先生成树和广度优先生成树如图所示
(3)广度优先生成树转换成二叉树如下图所示
附录习题及实验参考答案
习题1参考答案
1.1。
选择题
(1). A。
(2). A.(3)。
A. (4).B.,C.(5)。
A.(6)。
A.(7)。
C。
(8).C。
(9).B.(10.)A.
1。
2.填空题
(1)。
数据关系
(2)。
逻辑结构 物理结构
(3)。
线性数据结构 树型结构 图结构
(4).顺序存储 链式存储 索引存储 散列表(Hash)存储
(5).变量的取值范围 操作的类别
(6)。
数据元素间的逻辑关系 数据元素存储方式或者数据元素的物理关系
(7)。
关系 网状结构树结构
(8).空间复杂度和时间复杂度
(9). 空间 时间
(10).Ο(n)
1。
3名词解释如下:
数据:
数据是信息的载体,是计算机程序加工和处理的对象,包括数值数据和非数值数据。
数据项:
数据项指不可分割的、具有独立意义的最小数据单位,数据项有时也称为字段或域。
数据元素:
数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理,一个数据元素可由若干个数据项组成。
数据逻辑结构:
数据的逻辑结构就是指数据元素间的关系。
数据存储结构:
数据的物理结构表示数据元素的存储方式或者数据元素的物理关系.
数据类型:
是指变量的取值范围和所能够进行的操作的总和。
算法:
是对特定问题求解步骤的一种描述,是指令的有限序列.
1.4语句的时间复杂度为:
(1)Ο(n2)
(2)Ο(n2)
(3)Ο(n2)
(4)Ο(n—1)
(5)Ο(n3)
1.5 参考程序:
main()
{
int X,Y,Z;
scanf(“%d,%d,%d”,&X,&Y,Z);
if(X〉=Y)
if(X>=Z)
if (Y>
=Z)
{ printf(“%d,%d,%d"
X,Y,Z);
}
else
{ printf(“%d,%d,%d”,X,Z,Y);
else
{printf(“%d,%d,%d”,Z,X,Y);
else
if(Z>=X)
if(Y>=Z)
{ printf(“%d, %d, %d”,Y,Z,X);
{printf(“%d,%d, %d”,Z,Y,X);
else
{ printf(“%d,%d, %d”,Y,X,Z);
1.6参考程序:
{
inti,n;
floatx,a[],p;
printf(“\nn=”);
scanf(“%f"
,&
n);
printf(“\nx=”);
scanf(“%f”,&
x);
for(i=0;
i〈=n;
i++)
scanf(“%f "
&
a[i]);
p=a[0];
for(i=1;
i++)
{ p=p+a[i]*x;
x=x*x;
printf(“%f”,p)’
习题2参考答案
2.1选择题
(1).C。
(2)。
B。
(3)。
B。
(4). B. 5. D. 6。
B.7.B.8。
A。
9. A。
10.D.
2。
2.填空题
有限序列
顺序存储和链式存储
(3)。
O(n) O(n)
(4).n—i+1n—i
(5)。
链式
(6).数据 指针
前驱后继
(8).Ο
(1) Ο(n)
(9). s->
next=p->
next;
p—>
next=s ;
(10)。
s->
next
3. 解题思路:
将顺序表A中的元素输入数组a,若数组a中元素个数为n,将下标为0,1,2,…,(n-1)/2的元素依次与下标为n,n—1,…,(n—1)/2的元素交换,输出数组a的元素。
参考程序如下:
main()
{
inti,n;
floatt,a[];
printf(“\nn=”);
scanf(“%f"
,&n);
for(i=0;
i<
=n-1;
scanf(“%f ”,&a[i]);
for(i=0;
i<
=(n-1)/2;
i++)
{t=a[i];
a[i]=a[n-1-i];
a[n-1-i]=t;
}
for(i=0;
=n-1;
i++)
printf(“%f”,a[i]);
2.4 算法与程序:
main()
{
inti,n;
floatt,a[];
printf(“\nn=”);
scanf(“%f"
n);
for(i=0;
i<n;
scanf(“%f ”,&
a[i]);
for(i=1;
i〈n;
i++)
if(a[i]>
a[0]
{t=a[i];
a[i]=a[0];
a[0]=t;
}
printf(“%f"
a[0]);
for(i=2;
i〈n;
if(a[i]>
a[1]
{ t=a[i];
a[i] =a[1];
a[1]=t;
}
printf(“%f"
a[0]);
2.5算法与程序:
main()
{
inti,j,k,n;
float x,t,a[];
printf(“\nx=”);
scanf(“%f"
,&x);
scanf(“%f”,&n);
for(i=0;
i〈n;
i++)
scanf(“%f”,&a[i]);
// 输入线性表中的元素
for(i=0;
i<n;
i++){ //对线性表中的元素递增排序
k=i;
for(j=i+1;
j<n;
j++)if(a[j]〈a[k]) k=j;
if(k<
〉j){t=a[i];
a[i]=a[k];
a[k]=t;
}
for(i=0;
i++) //在线性表中找到合适的位置
if(a[i]〉x) break;
for(k=n-1;
k>
=i;
i--) //移动线性表中元素,然后插入元素x
a[k+1]=a[k];
a[i]=x;
for(i=0;
i<=n;
i++) //依次输出线性表中的元素
printf(“%f”,a[i]);
2.6算法思路:
依次扫描A和B的元素,比较A、B当前的元素的值,将较小值的元素赋给C,如此直到一个线性表扫描完毕,最后将未扫描完顺序表中的余下部分赋给C即可.C的容量要能够容纳A、B两个线性表相加的长度。
有序表的合并算法:
voidmerge(SeqListA,SeqList B,SeqList*C)
{inti,j,k;
i=0;
j=0;
k=0;
while(i〈=A.last&
&j〈=B.last)
if(A。
data[i]<
=B.data[j])
C—>data[k++]=A.data[i++];
else
C—〉data[k++]=B.data[j++];
while(i〈=A。
last)
C-〉data[k++]=A。
data[i++];
while(j<
=B.last )
C->
data[k++]=B.data[j++];
C->
last=k-1;
2。
7 算法思路:
依次将A中的元素和B的元素比较,将值相等的元素赋给C,如此直到线性表扫描完毕,线性表C就是所求递增有序线性表。
void merge(SeqListA,SeqListB, SeqList*C)
{int i,