数据结构本科形成性考核册答案.docx
《数据结构本科形成性考核册答案.docx》由会员分享,可在线阅读,更多相关《数据结构本科形成性考核册答案.docx(25页珍藏版)》请在冰豆网上搜索。
数据结构本科形成性考核册答案
数据结构(本科)形成性考核册答案
数据结构(本)形成性考核作业答案
作业1
(本部分作业覆盖教材第1-2章的内容)
一、单项选择题
1.C2.D3.B4.C5.D6.C7.B8.C9.A10.B
11.C12.D13.C14.A15.B16.C17.C18.B19.B20.D
二、填空题
1.n-i+1
2.n-i
3.集合线性结构树形结构图状结构
4.物理结构存储结构
5.线性结构非线性结构
6.有穷性确定性可形性有零个或多个输入有零个或多个输出
7.图状结构
8.树形结构
9.线性结构
10.n-1O(n)
11.s->next=p->next;
12.head
13.q->next=p->next;
14.p->next=head;
15.单链表
16.顺序存储链式存储
17.存储结构
18.两个直接后继直接前驱尾结点头结点
19.头结点的指针指向第一个结点的指针
20.链式链表
三、问答题
1.简述数据的逻辑结构和存储结构的区别与联系,它们如何影响算法的设计与实现
答:
若用结点表示某个数据元素,则结点与结点之间的逻辑关系就称为数据的逻辑结构。
数据在计算机中的存储表示称为数据的存储结构。
可见,数据的逻辑结构是反映数据之间的固有关系,而数据的存储结构是数据在计算机中的存储表示。
尽管因采用的存储结构不同,逻辑上相邻的结点,其物理地址未必相同,但可通过结点的内部信息,找到其相邻的结点,从而保留了逻辑结构的特点。
采用的存储结构不同,对数据的操作在灵活性,算法复杂度等方面差别较大。
2.解释顺序存储结构和链式存储结构的特点,并比较顺序存储结构和链式存储结构的优缺点。
答:
顺序结构存储时,相邻数据元素的存放地址也相邻,即逻辑结构和存储结构是统一的,,要求内存中存储单元的地址必须是连续的。
优点:
一般情况下,存储密度大,存储空间利用率高。
缺点:
(1)在做插入和删除操作时,需移动大量元素;
(2)由于难以估计,必须预先分配较大的空间,往往使存储空间不能得到充分利用;(3)表的容量难以扩充。
链式结构存储时,相邻数据元素可随意存放,所占空间分为两部分,一部分存放结点值,另一部分存放表示结点间关系的指针。
优点:
插入和删除元素时很方便,使用灵活。
缺点:
存储密度小,存储空间利用率低。
3.什么情况下用顺序表比链表好
答:
顺序表适于做查找这样的静态操作,链表适于做插入和删除这样的动态操作。
如果线性表的变化长度变化不大,且其主要操作是查找,则采用顺序表;如果线性表的长度变化较大,且其主要操作是插入、删除操作,则采用链表。
4.解释头结点、第一个结点(或称首元结点)、头指针这三个概念的区别
答:
头结点是在链表的开始结点之前附加的一个结点;第一个结点(或称首元结点)是链表中存储第一个数据元素的结点;头指针是指向链表中第一个结点(或为头结点或为首元结点)的指针。
5.解释带头结点的单链表和不带头结点的单链表的区别。
答:
带头结点的单链表和不带头结点的单链表的区别主要体现在其结构上和算法操作上。
在结构上,带头结点的单链表,不管链表是否为空,均含有一个头结点,不带头结点的单链表不含头结点。
在操作上,带头结点的单链表的初始化为申请一个头结点。
无论插入或删除的位置是地第一个结点还是其他结点,算法步骤都相同。
不带头结点的单链表,其算法步骤要分别考虑插入或删除的位置是第一个结点还是其他结点。
因为两种情况的算法步骤不同。
四、程序填空题
1.
(1)p->data=i
(2)p->next=NULL
(3)q->next=p
(4)q=p
2.
(1)head=p
(2)q=p
(3)p->next=NULL
(4)p->next=q->next
(5)q->next=p
3.
(1)p=q->next
(2)q->next=p->next
五、完成:
实验1――线性表
根据实验要求(见教材P201-202)认真完成本实验,并提交实验报告。
作业2答案
(本部分作业覆盖教材第3-5章的内容)
一、单项选择题
1.C2.B3.A4.C5.B6.A7.B8.C9.A10.C
11.B12.C13.B14.B15.A16.C17.B18.A19.C20.D
21.B22.D23.C24.B25.D26.A27.C28.D29.D30.C31.A32.D
二、填空题
1.后进先出
2.下一个
3.增1增1
4.假上溢
5.
栈是否满s->top=MAXSIZE-1栈顶指针栈顶对应的数组元素栈是否空s->top=-1栈顶元素修改栈顶指针
6.bceda
7.终止条件递归部分
8.LU->front==LU->rear
9.运算符操作数ab+c/fde/--
10.s->next=h;
11.h=h->next;
12.r->next=s;
13.f=f->next;
14.字符
15.顺序存储方式链式存储方式
16.0空格字符的个数
17.特殊稀疏
18.()(())2
19.((d,e,f))
20.串长度相等且对应位置的字符相等
21.i(i-1)/2+j
22.行下标、列下标、非零元素值
三、问答题
1.简述栈和一般线性表的区别。
答:
栈是一种先进后出的线性表,栈的插入和删除操作都只能在栈顶进行,而一般的线性表可以在线性表的任何位置进行插入和删除操作。
2.简述队列和一般线性表的区别。
队列是一种先进先出的线性表,队列的插入只能在队尾进行,队列的删除只能在队头进行,而一般的线性表可以在线性表的任何位置进行插入和删除操作。
3.链栈中为何不设头结点
答:
因为链栈只在链头插入和删除结点,不可能在链表中间插入和删除结点,算法实现很简单,所以一般不设置头结点。
4.利用一个栈,则:
(1)如果输入序列由A,B,C组成,试给出全部可能的输出序列和不可能的输出序列。
(2)如果输入序列由A,B,C,D组成,试给出全部可能的输出序列和不可能的输出序列。
答:
(1)栈的操作特点是后进先出,因此输出序列有:
A入,A出,B入,B出,C入C出,输出序列为ABC。
A入,A出,B入,C入,C出,B出,输出序列为ACB。
A入,B入,B出,A出,C入,C出,输出序列为BAC。
A入,B入,B出,C入,C出,A出,输出序列为BCA。
A入,B入,C入,C出,B出,A出,输出序列为CBA。
由A,B,C组成的数据项,除上述五个不同的组合外,还有一个C,A,B组合。
但不可能先把C出栈,再把A出栈,(A不在栈顶位置),最后把B出栈,所以序列CAB不可能由输入序列A,B,C通过栈得到。
(2)按照上述方法,可能的输出序列有:
ABCD,ABDC,ACBD,ACDB,ADCB,BACD,BADC,BCAD,BCDA,BDCA,CBAD,CBDA,CDBA,DCBA。
不可能的输出序列有:
DABC,ADBC,DACB,DBAC,BDAC,DBCA,DCAB,CDAB,CADB,CABD
5.用S表示入栈操作,X表示出栈操作,若元素入栈顺序为1234,为了得到1342出栈顺序,相应的S和X操作串是什么
答:
应是SXSSXSXX。
各操作结果如下:
S1入栈
X1出栈输出序列:
1
S2入栈
S3入栈
X3出栈输出序列:
13
S4入栈
X4出栈输出序列:
134
X2出栈输出序列:
1342
6.有5个元素,其入栈次序为:
A、B、C、D、E,在各种可能的出栈次序中,以元素C、D最先的次序有哪几个
答:
从题中可知,要使C第一个且D第二个出栈,应是A入栈,B入栈,C入栈,C出栈,D入栈。
之后可以有以下几种情况:
(1)B出栈,A出栈,E入栈,E出栈,输出序列为:
CDBAE。
(2)B出栈,E入栈,E出栈,A出栈,输出序列为CDBEA。
(3)E入栈,E出栈,B出栈,A出栈,输出序列为CDEBA
所以可能的次序有:
CDBAE,CDBEA,CDEBA
7.写出以下运算式的后缀算术运算式
⑴3x2+x-1/x+5
⑵(A+B)*C-D/(E+F)+G
答;对应的后缀算术运算式
⑴3x2^*x+1x/-5+
⑵AB+C*DEF+/-G+
8.简述广义表和线性表的区别和联系。
答:
广义表是线性表的的推广,它也是n(n>0)个元素a1,a2…ai…an的有限序列,其中ai或者是原子或者是一个广义表。
所以,广义表是一种递归数据结构,而线性表没有这种特性,线性表可以看成广义表的特殊情况,当ai都是原子时,广义表退化成线性表。
四、程序填空题
1.
(1)q->front->next=p->next;
(2)free(p);
(3)q->rear=q->front
五、综合题
1.
答:
出队序列是e2,e4,e3,e6,e5,e1的过程:
⑴e1入栈(栈底到栈顶元素是e1)
⑵e2入栈(栈底到栈顶元素是e1,e2)
⑶e2出栈(栈底到栈顶元素是e1)
⑷e3入栈(栈底到栈顶元素是e1,e3)
⑸e4入栈(栈底到栈顶元素是e1,e3,e4)
⑹e4出栈(栈底到栈顶元素是e1,e3)
⑺e3出栈(栈底到栈顶元素是e1)
⑻e5入栈(栈底到栈顶元素是e1,e5)
⑼e6入栈(栈底到栈顶元素是e1,e5,e6)
⑽e6出栈(栈底到栈顶元素是e1,e5)
⑾e5出栈(栈底到栈顶元素是e1)
⑿e1出栈(栈底到栈顶元素是空)
栈中最多时有3个元素,所以栈S的容量至少是3。
2.
算法设计如下:
/*只有一个指针rear的链式队的基本操作*/
#include<>
typedefcharelemtype;
structnode/*定义链队列结点*/
{
elemtypedata;
structnode*next;
};
typedefstructqueue/*定义链队列数据类型*/
{
structnode*rear;
}LinkQueue;
voidinitqueue(LinkQueue*Q)/*初始化队列*/
{
Q=(structqueue*)malloc(sizeof(structqueue));
Q->rear=NULL;
}
voidenqueue(LinkQueue*Q,elemtypex)/*入队算法*/
{
structnode*s,*p;
s=(structnode*)malloc(sizeof(structnode));
s->data=x;
if(Q->rear==NULL)/*原为空队时*/
{
Q->rear=s;
s->next=s;
}
else/*原队不为空时*/
{
p=Q->rear->next;/*p指向第一个结点*/
Q->rear->next=s;/*将s链接到队尾*/
Q->rear=s;/*Q->rear指向队尾*/
s->next=p;
}
}
voiddelqueue(LinkQueue*Q)/*出队算法*/
{
structnode*t;
if(Q->rear==NULL)
{
printf("队列为空!
\n");
return(0);
}
elseif(Q->rear->next==Q->rear)/*只有一个结点时*/
{
t=Q->rear;
Q->rear=NULL;
}
else/*有多个结点时*/
{
t=Q->rear->next;/*t指向第一个结点*/
Q->rear->next=t->next;/*引成循环链*/
}
free(t);
}
elemtypegethead(LinkQueue*Q)/*取队首元素算法*/
{
if(Q->rear==NULL)
printf("队列为空!
\n");
else
return(Q->rear->next->data);
}
intemptyqueue(LinkQueue*Q)/*判断队列是否为空算法*/
{
if(Q->rear==NULL)return
(1);/*为空,则返回true*/
elsereturn(0);/*不为空,则返回flase*/
}
voiddispqueue(LinkQueue*Q)/*显示队列中元素算法*/
{
structnode*p=Q->rear->next;
printf("队列元素:
");
while(p!
=Q->rear)
{
printf("%c",p->data);
p=p->next;
}
printf("%c\n",p->data);
}
六、完成:
实验2――栈、队列、递归程序设计
根据实验要求(见教材P203)认真完成本实验,并提交实验报告。
作业3答案
(本部分作业覆盖教材第6-7章的内容)
一、单项选择题
1.B2.B3.D4.C5.B6.A7.A8.C9.A10.D
11.A12.C13.C14.B15.B16.C17.B18.C19.A20.B
21.D22.B23.B24.B25.C26.A27.A28.C
二、填空题
1.子树树木或后继结点数
2.树中所有结点的度的最大值
3.分支结点非终端结点
4.叶子结点终端结点
5.子树的根后继结点孩子结点
6.祖先
7.树中结点的最大层数
8.
9.根结点左子树右子树
10.左子树根结点右子树
11.左子树右子树根结点
12.权
13.带权路径长度之和
14.最优二叉树最小的二叉树
15.69
16.2m-1
17.多对多
18.所有顶点一次
19.先序
20.按层次
21.n2
22.邻接矩阵邻接表
23.2(n-1)
24.n-1
25.栈
三、综合题
1.写出如下图所示的二叉树的先序、中序和后序遍历序列。
答:
二叉树的定义是递归的,所以,一棵二叉树可看作由根结点,左子树和右子树这三个基本部分组成,即依次遍历整个二叉树,又左子树或者右子树又可看作一棵二叉树并继续分为根结点、左子树和右子树三个部分…..,这样划分一直进行到树叶结点。
(1)先序为“根左右”,先序序列为:
fdbacegihl
(2)中序为“左根右”,中序序列为:
abcdefghij
(3)后序为“左右根”,后序序列为:
acbedhjigf
2.已知某二叉树的先序遍历结果是:
A,B,D,G,C,E,H,L,I,K,M,F和J,它的中序遍历结果是:
G,D,B,A,L,H,E,K,I,M,C,F和J,请画出这棵二叉树,并写出该该二叉树后续遍历的结果。
(1)二叉树图形表示如下:
(2)该二叉树后序遍历的结果是:
G、D、B、L、H、K、M、I、E、J、F、C和A。
3.答
⑴已知深度为k的二叉树最多有2k-1个结点(K≥1),
29-1<892<210-1,故树的高度为10
⑵对于完全二叉树来说,度为1的结点只能是0或1
因为n=n0+n1+n2和n0=n2+1
得:
设n1=0,892=n0+0+n2=2n2+1 得n2不为整数出错
设n1=1,892=n0+1+n2=2n2+2
得n2=445→n0=n2+1=446
叶子结点数为446。
⑶由⑵得单支结点数为1
⑷对于n个结点的完全二叉树,最后一个树叶结点,即序号为n的叶结点其双亲结点 即为最后一个非终端结点,
序号为892/2=446。
4.
(1)先序序列和中序序列相同的二叉树为空树或任一结点均无左孩子的非空二叉树
(2)中序和后序序列相同的二叉树为空树或任一结点均无右孩子的非空二叉树
(3)先序和后序序列相同的二叉树为空树或仅有一个结点
5.
(1)哈夫曼树如图B-4所示。
图B-4
(2)其带权路径长度WPL值为270。
(3)每个字符的哈夫曼编码为:
A:
100,B:
11,C:
1010,D:
000,E:
0010,F:
10110,G:
10111,H:
0011,I:
01
6.答
(1)深度优先遍历:
v1,v2,v3,v8,v5,v7,v4,v6
广度优先遍历:
v1,v2,v4,v6,v3,v5,v7,v8
(2)G的拓扑序列为:
v1,v2,v4,v6,v5,v5,v3,v5,v7,v8
(3)最短路径为:
v1,v2,v5,v7,v8
7.
① g1的图示和图g1的邻接表如下图所示。
图G
② 图G的邻接矩阵如下图所示:
图G的邻接矩阵图G的邻接表
③ V1、V2、V3、V4、V5的度分别为:
2,3,2,3,2
四、程序分析题
1.
(1)returnc1+1
(2)NodeLevel(BT->right,X)
(3)(c2>=1)returnc2+1
2.
(1)for(j=0;j(2)dfstree(GA,j,n);
五、算法设计题
1.写一个将一棵二叉树复制给另一棵二叉树的算法。
defineNULL0
typedefstructbtnode
{
elemtypedata;
structbtnode*lchild,*rchild;
}bitnode,*bitree;
bitree*CopyTree(bitnode*p)
{
/*复制一棵二叉树*/
bitnode*t;
if(p!
=NULL)
{
t=(bitnode*)malloc(sizeof(bitnode));
t->data=p->data;
t->lchild=CopyTree(p->lchild);
t->rchild=CopyTree(p->rchild);
return(t);
}
else
return(NULL);
}/*CopyTree*/
2.
intBTreeLeafCount(structBTreeNode*BT)
{
if(BT==NULL)return0;
elseif(BT->left==NULL&&BT->right==NULL)return1;
elsereturnBTreeLeafCount(BT->left)+BTreeLeafCount(BT->right);
}
六、完成:
实验3――栈、队列、递归程序设计
实验4——图的存储方式和应用
根据实验要求(见教材P203)认真完成本实验,并提交实验报告。
作业4答案
(本部分作业覆盖教材第8-9章的内容)
一、单项选择题
1.D2.C3.B4.C5.D 6.A7.C8.D9.B10.D
11.C12.C13.A14.C15.D16.B17.B18.D19.D20.A
21.D22.D23.A24.A25.C26.C27.B28.A29.B30.C
二、填空题
1.哈希表查找法
2.数据项的值记录
3.主关键字
4.数学期望值
5.顺序
6.二分查找升序或降序排列
7.顺序存储结构
8.索引顺序查找顺序查找
9.均小于根结点的值均大于根结点的值二叉排序树
10.自变量函数值
11.9,14,16,17
12.内部排序外部排序
13.交换排序
14.3
15.48
16.堆排序快速排序
17.主关键字
18.关键字相等的记录
19.n-1,n-j
20.堆尾堆顶向下
三、综合题
1.已知序列(70,83,100,65,10,32,7,9),请写出对此序列采用插入排序法进行升序排序时各趟的结果。
答:
原始序列:
(70),83,100,65,10,32,7,9
第1趟:
(70,83),100,65,10,32,7,9
第2趟:
(70,83,100),65,10,32,7,9
第3趟:
(65,70,83,100),10,32,7,9
第4趟:
(10,65,70,83,100),32,7,9
第5趟:
(10,32,65,70,83,100),7,9
第6趟:
(7,10,32,65,70,83,100),9
第7趟:
(7,9,10,32,65,70,83,100)
2.已知序列(10,18,4,3,6,12,1,9,15,8),请写出对此序列采用归并排序法进行升序排序时各趟的结果。
答:
原始序列:
10,18,4,3,6,12,1,9,15,8
第1趟:
[10,18][3,4][6,12][1,9][8,15]
第2趟:
[3,4,10,18,][1,6,9,12][8,15]
第3趟:
[3,4,10,18,][1,6,8,9,12,15]
第4趟:
[1,3,4,6,8,9,10,12,15,18]
3.已知序列(17,18,60,40,7,32,73,65,85)采用冒泡排序法排序的各趟的结果如下:
原始初始:
17,18,60,40,7,32,73,65,85
第1趟:
17,18,40,7,32,60,65,73,85
第2趟:
17,18,7,32,40,60,65,73,85
第3趟:
17,7,18,32,40,60,65,73,85
第4趟:
7,17,18,32,40,60,65,73,85
第5趟:
7,17,18,32,40,60,65,73,85
4.已知序列(503,87,512,61,908,170,897,275,653,462)请给出采用快速排序法对该序列作升序排列时的每一趟结果。
原始序列:
503,87,512,61,908,170,897,275,653,462
第1趟:
[462,87,275,61,170]503[897,908,653,512]
第2趟:
[170,87,275,61]462,503[897,908,653,512]
第3趟:
[87,61]170[275]462,503[897,908,653,512]
第4趟:
61[87]170[275]462,503[897,908,653,512]
第5趟:
61,87,170,[275]462,503[897,908,653,512]
第6趟:
61,87,170,275,462,503[897,908,653,512]
第7趟:
61,87,170,275,462,503[512,653]897[908]
第8趟:
61,87,170,275,462,503,512,[653]897[9