n<-next(n)
End(while)
q<-n
next(p)<--next(q)<-p
return
2.18设在长度大于1的循环链表中,即无头结点,也无头指正,p为指向链表中每个节点的指针,试编写算法删除该节点的前趋结点。
q<-Next(p)//找到该节点的前趋结点
p<-next(q);next(q)<-next(p)
RET(p)
Return
2.20试用单链表表示两个多项式:
A=4X12+5X8+6X3+4,B=3X12+6X7+2X4+5
(1)设计此两个多项式的数据结构
-1
A
0
4
3
6
8
5
12
4
-1
B
0
5
4
2
7
6
12
3
(2)写出两个多项式相加的算法
II答案参见33页即可
2.22CQ[0:
10]为一循环队列,初态front=rear=1,画出下列操作后队的头,尾指示器状态:
(1)d,e,b,g,h入队;rear=6front=1
(2)d,e出队rear=6front=3
(3)I,j,k,l,m入队rear=0front=3
(4)b出队rear=0front=4
(5)n,o,p,q,r入队rear=5front=4
2.25有一个二维数组A[1:
m;1:
n],假设A[3,2]地址为1110,A[2,3]地址为1115,
若每个单元占一个空间,问A[1,4]的地址是多少
答案:
1120
2.26用三维数组和带行辅助向量形式表示下列稀疏矩阵:
答案:
(1)
1
1
15
1
4
22
1
6
-15
2
2
11
2
3
3
3
4
-6
5
1
91
6
3
28
I
1
2
3
5
6
Pos
1
2
4
1
3
Num
3
2
1
1
1
(2)参考上面的,和47,48页的内容
2.28将题图2.3的一般树化为二叉树。
答案:
2.29设一颗完全二叉数有1000个结点,试问:
(1)有多少个叶子结点489
(2)有多少个度为2的结点2
(3)有多少个结点只有非空左子树1
2.30设一颗二叉树其中序和后序遍历为
中序:
BDCEAFHG
后序:
DECBHGFA
答案:
ABCDEFHG
2.31.对二叉树写出如下算法:
(1)复制一棵二叉树;
(2)判断两棵二叉树是否相等;
(3)计算二叉树的树叶;
(4)计算二叉树的深度;
解:
1)//复制一棵二叉树
/*算法思想
采用递规函数来实现
(1)如果树为空,则复制一棵空树;
(2)如果树不为空,则依次递规复制已知二叉树的左子树和有子树;
(3)生成一个新的根结点,使复制得到的左子树和右子树的根指针分别成为这个新生成结点的左指针域和右指针域的值。
算法编写:
*/
BiTree*CopyTree(BiTree*T){
//
if(!
T)returnNULL;
if(T->lchild)
newlchild=CopyTree(T->lchild);//
elsenewlchild=NULL;//
if(T->rchild)
newrchild=CopyTree(T->rchild);//
elsenewrchild=NULL;//
newnode=GetTreeNode(T->data,newlchild,newrchild);//
returnnewnode;
}//CopyTree
BiTNode*GetTreeNode(TelemTypeitem,BiTNode*lptr,BiTNode*rptr){
//
T=newBiTNode;
T->data=item;T->lchild=lptr;T->rchild=rptr;
returnT;
}//GetTreeNode
(2)
在这里要对一种情况进行说明
当root1的左子树与root2的左子树相同,root1的右子树与root2的右子树相同时,这两颗二叉树相同。
当root1的左子树与root2的右子树相同,root1的右子树与root2的左子树相同时,这两颗二叉树同样相同。
以下是实现代码
bool IsBSTEqual(BNode* root1,BNode* root2)
{
if (root1==NULL && root2==NULL)
{
return true;
}
else if (root1==NULL || root2==NULL)
{
return false;
}
else
{
if (root1->data !
= root2->data)
{
return false;
}
bool is_left = IsBSTEqual(root1->left,root2->left);
bool is_right = IsBSTEqual(root1->right,root2->right);
if (is_left&&is_right)
return true;
else
{
is_right = IsBSTEqual(root1->right,root2->left);
is_left = IsBSTEqual(root1->left,root2->right);
if (is_left&&is_right)
return true;
else
return false;
}
}
}
3)4)
计算叶子数和树的深度。
计算叶子:
递归每个节点,当没有左孩子和右孩子时即为叶子。
计算深度:
对每个节点计算左右子树的深度,节点的最终深度是其子树深度的最大值加1,空树返回-1.
structTree
{
ElementTypeElement;
Tree*left;
Tree*right;
};
intCountLeaf(Tree*T)
{
staticintcount=0;
if(T!
=NULL)
{
CountLeaf(T->left);
CountLeaf(T->right);
if(T->left==NULL&&T->right==NULL)
count++;
}
returncount;
}
intDepth(Tree*T)
{
intdepthLeft,depthRight,depth;
if(T==NULL)
return-1;
else
{
depthLeft=Depth(T->left);
depthRight=Depth(T->right);
depth=1+(depthLeft>depthRight?
depthLeft:
depthRight);
}
returndepth;
}
2.32.给定一组元素{17,28,36,54,30,27,94,15,21,83,40},画出由此生成的二叉排序树。
解:
2.33.给定一组权值W={8,2,5,3,2,17,4},画出由此生成的哈夫曼树。
2.34.有一图如题图2.4所示:
(1)写出此图的邻接表与邻接矩阵;
(2)由给点V1作深度优先搜索和广度优先搜索;
(3)试说明上述搜索的用途。
解:
(1)
(2)
V1作深度优先搜索:
V1作广度优先搜索:
(3)为了避免同一顶点被多次访问。
2.35.有一又向图如题图2.5所示:
(1)写出每一结点的入度和出度各为多少;
(2)写出上图的邻接矩阵和邻接表。
解:
V1:
入度=3出度=0
V2:
入度=2出度=2
V3:
入度=1出度=2
V4:
入度=2出度=2
V5:
入度=2出度=1
V6:
入度=0出度=4
3.36求题图2.6中结点a到各结点之间最短路径。
2
222
123
314
1
解:
2.37求题图2.7中所示AOV网所有可能的拓扑顺序结果。
解:
拓扑排序:
V7->V5->V2->V4->V6->V3->V1->V8
2.38题图2.8所示AOE网,求:
(1).每一事件最早开始时间和最晚开始时间;
(2).该计划最早完成时间为多少。
解:
活动最早最迟开始时间
a1a2a3a4a5a6a7a8a9a10a11a12a13a14
E00566121212191916202325
L409616121916191923202325
L-E404010074007000
事件最早最迟开始时间
V1V2V3V4V5V6V7V8V9V10
VE05612191620232527
VL09612192320232527
2.39画出进行分块查找的数据组织形式。
解:
设将数据分成4块,每块中记录个数5,
先查找索引值
97451975179752897543
第1块234
97321,97421,97451,
97241,97118
97250,97407,97239,
97227,97517
97438,97102,97528
97136,07338
97543,97309
2.40画一棵对20个记录进行对分查找的判定树,并求等概率情况下的平均查找长度。
ASL=(1+2*2+3*4+4*8+5*5)/20=3.7
2.6数据的存储结构主要有哪两种?
它们之间的本质区别是什么?
数据的存储结构:
向量和链表。
本质区别:
向量是连续存放的,其存储空间是静态分配的,以存放顺序来表达元素的前后件的关系。
链式存储结果不需要一组连续的存储单元,其数据元素可以分散存放在存储空间中,其元素关系由指针来指向。
2.5试比较顺序表和链表的优缺点。
1.线性表的长度是否固定方面:
由于向量的存储空间是静态分配的,链表的存储空间是动态分配的,因此若表长不固定时采用线性链表较好。
2.线性表的主要操作是什么:
由于向量是连续存放的,所以适用于查找操作,不适用插入、删除操作。
由于线性链表只能顺序存取,所以适用于插入、删除操作,不适用于查找操作。
3.采用的算法语言:
线性链表要求所使用的语言工具提供指针类型变量。
2.6试比较单向链表与双向链表的优缺点。
1.单向链表只能单方向地寻找表中的结点,双向链表具有对称性,从表中某一给定的结点可随意向前或向后查找。
2.在作插入、删除运算时,双向链表需同时修改两个方向上的指针,单向链表则简便些。
2.7试说明树与二叉树有何不同?
为何要将一般树转换为二叉树?
树与二叉树区别:
树是由n个(n>=0)结点组成的有限集合T,其中有且仅有一个结点称为根结点,在此类元素结点之间存在明显的分支和层次关系。
二叉树是一种特殊的树结构,每一个结点最多只有两个孩子,即最多只有两个分支。
为何要转换:
一般树,树中结点次序没有要求,分支庞杂。
而二叉树,元素之间存在严谨的前后代关系,在对数据元素进行删除、查找、插入等运算时更加有效率。
2.8若一棵排序二叉树的关键字输入序列为{80,6,10,7,8,25,100,90},请画出该二叉树。
解:
二叉排序树为:
2.9对于关键字序列{49,38,65,97,76,13},回答下述问题。
(共12分)
(1)写出一趟冒泡排序的结果。
(6分)
(2)写出一趟快速排序的结果。
参考答案如下:
(1)写出一趟冒泡排序的结果。
(6分)
{38,49,65,76,13,97}
(2)写出一趟快速排序的结果。
(6分)
{13,38,49,97,76,65}
2.10请给出图1的所有最小生成树。
(10分)
答:
共有两颗:
2.11请给出图2的所有拓扑排序序列。
(16)
答案如下:
仅有两个
第一个:
abcdefgh
第二个:
abcdegfh
2.12已知某二叉树的前序遍历序列为:
ABCDEFG
和中序遍历序列为:
CBEDAFG。
请画出该二叉树。
答案如下:
2.13构造该图的最小生成树。
图的最小生成树如下
第三章
3.1操作系统的基本功能是什么?
它包括哪些部分?
基本功能:
操作系统应该具有处理器管理,存储管理,设备管理和文件管理功能,同时,为了使用户能方便地使用机器,操作系统还应提供用户接口功能。
构成部分:
(1).对CPU的使用进行管理的进程调度程序。
(2).对内存分配进行管理的内存管理程序。
(3).对输入输出设备进行管理的设备驱动程序。
(4).对外存中信息进行管理的文件系统。
3.2试说明虚拟机的概念以及实现的方法。
在裸机外面每增加一个软件层后就会变成一台功能更强的机器,我们通常把这种计算机系统称为虚拟机。
虚拟机的实现方法:
在裸机上装上操作系统对机器进行首次扩展,再在操作系统的基础上增加其他软件,这样就可以实现“虚拟机”。
3.3通常操作系统有哪几种基本类型?
各有什么特点及适用于何种场合?
三大类:
(1)多道批处理系统:
计算机内存中同时可以存放多道作业,用户与作业之间没有交互作用,用户不能直接控制作业的运行。
此类系统一般用于计算中心等较大型的计算机系统中。
(2)分时系统:
多个用户通过终端分享同一台计算机,并通过终端直接控制程序运行,进行人与机器之间的交互。
此类系统适用于程序的开发。
(3)实时系统:
对外部发生的随机事件作出及时的响应,并对它进行处理。
此类系统一般用于工业控制系统或事物处理系统。
3.4试说明你所使用过的操作系统的类型和特点。
Windows系统:
多用户多任务操作系统。
特点:
全新的、友善的用户界面。
提供了功能强大的应用程序。
具有多任务并行处理能力,各种应用程序之间可以方便地进行切换和交换信息。
具有强大的内存管理能力,支持扩展内存功能,提高系统运行效率。
3.5解释名空间、作业地址空间和存储空间的关系以及逻辑地址和物理地址的区别。
存放源程序的空间称为名空间。
当汇编或编译程序将源程序转换成目标程序后,一个目标程序所占有的地址范围称为地址空间,这些地址的编号是相对于起始地址而定的,一般定起始位零,称为逻辑地址或相对地址。
存储空间是指当目标程序装入主存后占用的一系列物理单