数据结构作业解答汇总Word下载.docx
《数据结构作业解答汇总Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构作业解答汇总Word下载.docx(18页珍藏版)》请在冰点文库上搜索。
二、判断题
1.数据元素是数据的最小单位。
(×
)
2.记录是数据处理的最小单位。
(×
3.数据的逻辑结构是指数据的各数据项之间的逻辑关系;
(×
)
4.算法的优劣与算法描述语言无关,但与所用计算机有关。
(√)
5.健壮的算法不会因非法的输入数据而出现莫名其妙的状态。
6.算法可以用不同的语言描述,如果用C语言或PASCAL语言等高级语言来描述,则算法实际上就是程序了。
7.程序一定是算法。
8.数据的物理结构是指数据在计算机内的实际存储形式。
9.数据结构的抽象操作的定义与具体实现有关。
10.在顺序存储结构中,有时也存储数据结构中元素之间的关系。
11.顺序存储方式的优点是存储密度大,且插入、删除运算效率高。
三、用C语言程序完成三元组的初始化、取i号位上的值及修改i号位上的值。
#include<
stdio.h>
stdlib.h>
#defineok1
#defineerror-1
typedefint*triplet;
typedefintstatus;
statusinit(triplet*t,intv1,intv2,intv3)
{*t=(int*)malloc(3*sizeof(int));
if(!
(*t))returnerror;
(*t)[0]=v1;
(*t)[1]=v2;
(*t)[2]=v3;
returnok;
}
statusget(triplett,inti,int*e)
{if(i<
1||i>
3)returnerror;
*e=t[i-1];
voidmain()
{tripleta;
inti,e,e1,e2,e3;
intb;
printf("
输入三元组的三个值:
"
);
scanf("
%d%d%d"
&
e1,&
e2,&
e3);
b=init(&
a,e1,e2,e3);
if(b==1)printf("
%5d,%5d,%5d\n"
a[0],a[1],a[2]);
elseprintf("
创建三元组失败\n"
输入取得三元组元素的位置:
%d"
i);
b=get(a,i,&
e);
%5d\n"
e);
位置错误\n"
第二章作业
一选择题
1.下述哪一条是顺序存储结构的优点?
(A)
A.存储密度大B.插入运算方便C.删除运算方便D.可方便地用于各种逻辑结构的存储表示
2.下面关于线性表的叙述中,错误的是哪一个?
(B)
A.线性表采用顺序存储,必须占用一片连续的存储单元。
B.线性表采用顺序存储,便于进行插入和删除操作。
C.线性表采用链接存储,不必占用一片连续的存储单元。
D.线性表采用链接存储,便于插入和删除操作。
3.线性表是具有n个(C)的有限序列(n>
0)。
A.表元素B.字符C.数据元素D.数据项E.信息项
4.若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用(A)存储方式最节省时间。
A.顺序表B.双链表C.带头结点的双循环链表D.单循环链表
5.某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用(D)存储方式最节省运算时间。
A.单链表B.仅有头指针的单循环链表C.双链表D.仅有尾指针的单循环链表
6.设一个链表最常用的操作是在末尾插入结点和删除尾结点,则选用(D)最节省时间。
A.单链表B.单循环链表C.带尾指针的单循环链表D.带头结点的双循环链表
7.若某表最常用的操作是在最后一个结点之后插入一个结点或删除最后一个结点。
则采用(D)存储方式最节省运算时间。
A.单链表B.双链表C.单循环链表D.带头结点的双循环链表
8.静态链表中指针表示的是(C).
A.内存地址B.数组下标C.下一元素地址D.左、右孩子地址
9.链表不具有的特点是(B)
A.插入、删除不需要移动元素B.可随机访问任一元素
C.不必事先估计存储空间D.所需空间与线性长度成正比
10.下面的叙述不正确的是(B,C)
A.线性表在链式存储时,查找第i个元素的时间同i的值成正比
B.线性表在链式存储时,查找第i个元素的时间同i的值无关
C.线性表在顺序存储时,查找第i个元素的时间同i的值成正比
D.线性表在顺序存储时,查找第i个元素的时间同i的值无关
12.
(1)静态链表既有顺序存储的优点,又有动态链表的优点。
所以,它存取表中第i个元素的时间与i无关。
(2)静态链表中能容纳的元素个数的最大数在表定义时就确定了,以后不能增加。
(3)静态链表与动态链表在元素的插入、删除上类似,不需做元素的移动。
以上错误的是(B)
A.
(1),
(2)B.
(1)C.
(1),
(2),(3)D.
(2)
13.若长度为n的线性表采用顺序存储结构,在其第i个位置插入一个新元素的算法的时间复杂度为(C)(1<
=i<
=n+1)。
A.O(0)B.O
(1)C.O(n)D.O(n2)
14.对于顺序存储的线性表,访问结点和增加、删除结点的时间复杂度为(C)。
A.O(n)O(n)B.O(n)O
(1)C.O
(1)O(n)D.O
(1)O
(1)
15.线性表(a1,a2,…,an)以链接方式存储时,访问第i位置元素的时间复杂性为(C)
A.O(i)B.O
(1)C.O(n)D.O(i-1)
16.非空的循环单链表head的尾结点p满足(A)。
A.p->
link=headB.p->
link=NILLC.p=NILLD.p=head
17.循环链表H的尾结点P的特点是(A)。
A.P^.NEXT:
=HB.P^.NEXT:
=H^.NEXTC.P:
=HD.P:
=H^.NEXT
18.在一个以h为头的单循环链中,p指针指向链尾的条件是(A)
A.p->
next=hB.p->
next=NULLLC.p->
next->
next=hD.p->
data=-1
19.完成在双循环链表结点p之后插入s的操作是(D);
A.p->
next:
=s;
s->
priou:
=p;
p->
=p->
next;
B.p->
next->
=s;
p->
s->
=p->
C.s->
D.s->
二、判断
1.链表中的头结点仅起到标识的作用。
2.顺序存储结构的主要缺点是不利于插入或删除操作。
3.线性表采用链表存储时,结点和结点内部的存储空间可以是不连续的。
4.顺序存储方式插入和删除时效率太低,因此它不如链式存储方式好。
5.对任何数据结构链式存储结构一定优于顺序存储结构。
6.顺序存储方式只能用于存储线性结构。
7.集合与线性表的区别在于是否按关键字排序。
8.所谓静态链表就是一直不发生变化的链表。
9.线性表的特点是每个元素都有一个前驱和一个后继。
10.取线性表的第i个元素的时间同i的大小有关.(×
11.循环链表不是线性表.(×
12.线性表只能用顺序存储结构实现。
13.线性表就是顺序存储的表。
14.为了很方便的插入和删除数据,可以使用双向链表存放数据。
(√)
15.顺序存储方式的优点是存储密度大,且插入、删除运算效率高。
16.链表是采用链式存储结构的线性表,进行插入、删除操作时,在链表中比在顺序存储结构中效率高。
(√)
三、编写下列算法:
1、将两个单链表合并成一个单链表。
voidmerge(ListLink&
La,ListLink&
Lb)
{p=La->
while(p->
next){p=p->
}
next=Lb->
free(Lb);
2、有一个有序单链表(从小到大),表头指针为head,编写一个算法向该单链表中插入一个元素值为x的结点,使插入后该链表依然有序。
voidinsert(LinkList&
head,ElemTypex)
{
p=head;
next&
&
p->
next<
x)p=p->
s=(LinkList)malloc(sizeof(LNode));
data=x;
s->
next=p->
next;
next=s;
3、用算法是实现带头结点的单链表数据结点逆置。
(原链表为a1,a2,…,an)
(逆置后为:
an,an-1,…,a2,a1)
voidserver(LinkList&
L)
{
p=L->
L->
next=NULL;
while(p)
{r=p->
//将p的后继结点的地址保存在r中
next=L->
//将p卸下来,每次插在L之和,第一个结点之前
next=p;
p=r;
//还原p
第三章作业
1、设队列中有A、B、C、D、E这五个元素,其中队首元素为A。
如果对这个队列重复执行下列4步操作:
(1)输出队首元素;
(2)把队首元素值插入到队尾;
(3)删除队首元素;
(4)再次删除队首元素。
直到队列为空为止,求得到的输出序列。
ACECC
(1)输出A,
(2)队列为ABCDEA
(3)队列为BCDEA(4)队列为CDEA
重复:
(1)输出C,
(2)队列为CDEAC
(3)队列为DEAC(4)队列为EAC
(1)输出E,
(2)队列为EACE
(3)队列为ACE(4)队列为CE
(1)输出C,
(2)队列为CC
(3)队列为C(4)队列为空
得到的输出序列:
2、假设以带头结点的循环链表表示队列,并且只设一个尾指针rear指向队尾元素结点(注意不设头指针),试编写相应的队列初始化、入队列和出队列的算法。
voidinitqueue(LinkList&
rear)
{//初始化队列为空队列
rear=(LinkList)malloc(sizeof(LNode));
rear->
next=rear;
voidinqueue(LinkList&
rear,ElemTypee)
{//入队列
data=e;
next=rear->
rear->
rear=p;
voidDelqueue(LinkList&
rear,ElemType&
e)
{//出队列
if(rear->
next==rear)printf(“队列为空”);
else{
p=rear->
rearr->
next=p->
free(p);
第六章作业
1、已知二叉树的前序序列为ABDGHCEFI和中序序列GDHBAECIF,求后序序列。
2、对二叉树中的结点进行按层次顺序(每一层自左至右)的访问操作称为二叉树的层次遍历,遍历所得到的结点序列称为二叉树层次序列。
现已知一棵二叉树的层次序列为ABCDEFGHIJ,中序序列为DBGEHJACIF,请画出此二叉树。
3、对下图所示的森林:
(1)求森林的前序序列和后序序列;
(2)将此森林转换为相应的二叉树;
(1)此森林的前序序列:
ABCDEFGHIJKLMPQRNO
此森林的后序序列:
BDEFCAIJKHGQRPMNOL
4、假设用于通信的电文由字符集{a,b,c,d,e,f,g,h}中的字母构成,这8个字母在电文中出现的概率分别为{0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10}
(1)试构造哈夫曼树。
(2)写出这8个字母的哈夫曼编码。
哈夫曼编码图见题图
根据上图可得编码表:
a:
0010
b:
10
c:
00000
d:
0001
e:
01
f:
00001
g:
11
h:
0011
5、算法设计:
用先序遍历和中根序遍历的思想统计叶子结点的个数。
解法一:
先序遍历
intLeaf(Bitreet)
{intstaticn=0;
if(t){if(t->
lchild==NULL&
t->
rchild==NULL)n++;
Leaf(t->
lchild);
returnn;
中序遍历
intn=0;
voidLeaf(Bitreet)
if(t){
if(t->
//还可以用非递归的思想实现
6、算法设计:
已知二叉树采用二叉链表存放,要求返回二叉树的后序遍历的第一个结点的指针,不用栈不用递归实现。
Bitreeorderfirst(Bitreet)
{p=t;
while(p)
while(p->
lchild)p=p->
lchild;
if(p->
rchild==NULL)returnp;
else
p=p->
rchild;
第七章作业
1.对图7.26所示的连通图,请分别用Prim算法构造其最小生成树。
2对图7.27所示的有向图,试利用Dijkstra算法求出从源点1到其它各顶点的最短路径,并写出执行算法过程.
答:
从源点1到各点的路径如下所示:
1到2:
132
1到3:
13
1到4:
1364
1到5:
1325
1到6:
136
整个执行算法过程中的扩充顶点集的每次循环状态见题目后的表。
(用文本格式不方便表示)
循环状态表如下:
D[]表示路径长度p[]表示路径的前驱顶点
循环
顶点集
K
D[1]
D[2]
D[3]
D[4]
D[5]
D[6]
P[1]
P[2]
P[3]
P[4]
P[5]
P[6]
初始化
{1}
-
20
15
∞
1
{1,3}
3
19
25
2
{1,3,2}
29
{1,3,2,6}
6
4
{1,3,2,6,4}
5
{1,3,2,6,4,5}
同上
3试写出下图所示有向图的所有拓扑序列。
1,5,4,3,2,6
1,5,3,4,2,6
1,5,3,2,4,6
3,1,5,4,2,6
3,1,2,5,4,6
等
4.求每个事件的最早发生时间和最晚发生时间。
最早发生时间
60
50
75
最晚发生时间
16