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

2018年北京市培养单位材料科学与光电技术院862计算机学科综合(非专业)[专硕]之数据结构考研基础五套测试题

  摘要

一、算法设计题

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

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

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

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

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

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

(1)算法如下:

( )

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

//申请头结点

//链表初始化

//建立n 个结点的链表

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

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

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

1

//指针后移

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

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

//结束for 循环

//结束creat 算法

第 2 页,共 43 页

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

(2)算法如下:

( )

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

//申请头结点

//链表初始化

//建立n 个结点的链表

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

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

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

1

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

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

//指针后移

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

//if新结点插入

//结束for 循环建表

r

(输入要输出单词的个数

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

(”第

//结束算法

2. 有n 个记录存储在带头结点的双向链表中,现用双向起泡排序法对其按上升序进行排序,请写出这种排序的算法(注:双向起泡排序即相邻两趟排序向相反方向起泡) 。

【答案】算法如下:

第 3 页,共 43 页

) ;

个单词出现次\n”,++i,p ﹣>data ,p ﹣>freg) ;

对存储在带头结点的双向链表head 中的元素进行双向起泡排序

设标记

双向链表尾,算法过程中是向上起泡的开始结点

是工作指针,指向当前结点

假定本趟无交换

向下(右) 起泡,一趟有一个最大元素沉底

交换两结点指针,涉及6条链

有交换

先将结点从链表上摘下

将temp 插到p 结点前

无交换,指针后移

准备向上起泡

向上(左) 起泡,一趟有一个最小元素冒

交换两结点指针,涉及6条链

有交换

先将temp 结点从链表上摘

将temp 插到p 结点后(右

)

无交换,指针前移

准备向下起泡

算法结束

3. 设有一头指针为L 的带有表头结点的非循环双向链表,其每个结点中除有pred(前驱指针) ,data(数据) 和next(后继指针) 域外,还有一个访问频度域freq 。在链表被启用前,其值均初始化为零。每当在链表中进行一次Locate(L,X) 运算时,令元素值为x 的结点中freq 域的值增1,并使此链表中结点保持按访问频度非增(递减) 的顺序排列,同时最近访问的结点排在频度相同的结点的最后,以便使频繁访问的结点总是靠近表头。试编写符合上述要求的Locate(L,x) 运算的算法,该运算为函数过程,返回找到结点的地址,类型为指针型。

【答案】算法如下:

第 4 页,共 43 页