当前位置:问答库>考研试题

2018年中国科学技术大学信息科学技术学院834软件工程基础[专业硕士]之数据结构考研基础五套测试题

  摘要

一、算法设计题

1. 己知L 为链表的头结点地址,表中共有m(m>3) 个结点,从表中第i 个结点(l<i <m) 起到第m 个结点构成一个循环部分链表,设计将这部分循环链表中所有结点顺序完全倒置的算法。

【答案】算法如下:

//L是有m 个结点的链表的头结点的指针。表中从第个结点到第m 个结点构成循环部分链表//本算法将这部分循环链表倒置

//p是工作指针,初始指向第二结点(已假定i >

l) //pre是前驱结点指针,最终指向第i ﹣i 个结点

//计数器

//查找第i 个结点

//査找结束,P 指向第i 个结点

//暂存第i 个结点的指针

//p指向第i +l 个结点,准备逆置

//上面while 循环结束时,j =i ﹣1现从第i +1结点开始逆置

//暂存P 的后继结点

+

//逆置P 结点

//P恢复为当前待逆置结点

//计数器增

1

//将原第i 个结点的后继指针指向原第m 个结点

2. 设键盘输入n 个英语单词,输入格式为词个数,试编一程序,建立一个单向链表,实现:

(1)如果单词重复出现,则只在链表上保留一个。

第 2 页,共 40 页

其中n 表示随后输入英语单

(2)除满足(1)的要求外。链表结点还应有一个计数域,记录该单词重复出现的次数,然后输出出现次数最多的前k(k<=n) 个单词。

【答案】定义结点数据类型如下:

//频度域,记单词出现的次数

//maxsize是单词中可能含有的最多字母个数

(1)算法如下:

( )

//建立有n(n>0) 个单词的单向链表,若单词重复出现,则只在链表中保留一个

//申请头结点

//链表初始化

//建立n 个结点的链表

//a是与链表中结点数据域同等长度的字符数组

//p是工作指针,pre 是前驱指针

//单词重复出现,频度增

1

//指针后移

//该单词没出现过,应插入

//将新结点插入到链表最后

//结束for 循环

//结束creat 算法 (2)算法如下:

( )

//建立有n 个单词的单向链表,重复单词只在链表中保留一个,最后输出频度最高的k 个单词

//申请头结点

//链表初始化

//建立n 个结点的链表

//a是与链表中结点数据域同等长度的字符数组

//P是工作指针,pre 是前驱指针

第 3 页,共 40 页

//单词重复出现,频度增

1

//先将P 结点从链表上摘下,再按频度域值插入到合适位置

//将P 结点插入到合适位置

//指针后移

//该单词没出现过,应插入到链表最后

//if新结点插入

//结束for 循环建表

r

(输入要输出单词的个数

//输出频度最髙的k 个单词

(”第

//结束算法

3. 设T 是一棵满二叉树,写一个把T 的后序遍历序列转换为前序遍历序列的递归算法。

【答案】算法如下:

将满二叉树的后序序列转为前序序列,

标。

根结点

左子树或右子树的结点数

将左子树前序序列转

为后序序列

将右子树前序序列转为

后序序列

是序列初始和最后结点的下

个单词

出现

次\n”,++i,p ﹣>data ,p ﹣>freg) ;

) ;

第 4 页,共 40 页