2018年北京市培养单位遥感与数字地球研究所864程序设计之数据结构考研基础五套测试题
● 摘要
一、算法设计题
1. 请用流程图或高级语言表示算法。已知有向图有n 个顶点,请写算法,根据用户输入的数对建立该有向图的邻接表。即接受用户输入的
(以其中之一为0标志结束) ,对于每条这样的
边,申请一个结点,并插入到的单链表中,如此反复,直到将图中所有边处理完毕。
提示:先产生邻接表的n 个头结点(其结点数值域从1到n) 。 【答案】算法如下:
建立有向图的邻接表存储结构
题目要求两顶点之一为0表示结束
2. 在一个循环链队中只有尾指针(记为rear ,结点结构为数据域data ,指针域next) ,请给出这种队列的入队和出队操作的实现过程。
【答案】算法如下:
//rear是带头循环链队列的尾指针,本算法将元素X 插入到队尾
//申请结点空间
//将s 结点链入队尾
//rear指向新队尾
//rear是带头结点的循环链队列的尾指针
//本算法执行出队操作,成功输出队头元素;否则给出出错信息
//s指向队头元素
第 2 页,共 35 页
输入顶点信息
//队头元素出队
//空队列
3. 给出以十字链表作存储结构,建立图的算法,输入(i, j , V) , 其中i , j 为顶点号,v 为权值。
【答案】算法如下:
建立有向图的十字链表存储结构
假定权值为整型
建立顶点向量
当输入i 、j 、v 之一为0时,结
束算法运行
申请结点
弧结点中权值域
算法结束
4. 假设在二叉链表的结点中增设两个域:parent 域指示其双亲结点:flag 域(取值为历的递推形式的算法。
【答案】算法如下:
在增加双亲指针
和标志域
的二叉树中,不用栈后序遍历二叉树
) 区分在遍
历过程中到达该结点时应继续向左、向右或访问该结点。试以此存储结构编写不用栈进行后序遍
向左
向右
访问根结点
找被访问结点的双亲
第 3 页,共 35 页
结束
5. 已知一具有n
个结点的二叉树的中序遍历序列与后序遍历序列分别存放于数组
和
中(设该二叉树各结点的数据值均不相同) 。请写一建立该二叉树的二叉链表结构的非递
归算法。该二叉链表的链结点结构为(lchild, data , rchild) ,其中data 为数据域,lchild 与rhild 分别为指向该结点左、右孩子的指针域(当孩子结点不存在时,相应指针域为空,用nil 表示) 。
【答案】算法如下:
由二叉树的中序序列IN[ ]和后序序列POST[ ]建立二叉树
和
为栈,容量足够大
分別是中序序列和后序序列第一和最后元素的下标,初始调用时
,
初始化
取出栈顶数据
在中序序列中査等于
.
根结点的值
无左子树
将建立左子树的数据入栈
无右子树
的结点
右子树数据入
结束
:
二、应用题
6. 在模试匹配KMP 算法中所用失败函数的定义中,为何要求P 1P 2......P j 为P 1P 2......P j 两头匹配的真子串?且为最大真子串?
【答案】失败函数(即next) 的值只取决于模式串自身,若第j 个字符与主串第i 个字符失配时,假定主串不回溯,模式串用第k(即next[j])个字符与第i 个相比,有
为了不因
模式串右移与主串第i 个字符比较而丢失可能的匹配,对于上式中可能存在的多个k 值,应取其中最大的一个。这样,因j ﹣k 最小,即模式串向右滑动的位数最小,避免因右移造成可能匹配的
第 4 页,共 35 页