2018年北京市培养单位空间应用工程与技术中心866计算机原理之数据结构考研强化五套模拟题
● 摘要
一、算法设计题
1. 试设计一个C 语言算法(或C 语言程序) :用单链表做存储结构,以回车符为结束标志,输入一个任意长度的字符串,然后判断该字符串是否为“回文”(正向读和反向读时,串值相同的字符串称为“回文”) ,输出信息“Yes ”或“NO ”;最后删除字符串并释放全部空间。例如:
若输入“ABCD12321DCBA”是回文,则输出“Yes”; 若输入“ABCD123DCBA”,不是回文,则输出“NO”。
要求:定义相关数据类型,不得使用数组(顺序表) 做字符串的存储结构和辅助存储空间。假定字符串的长度为n ,试分析上述算法的时间复杂度。
【答案】算法如下:
//本算法判断数据域为字符且长为n 的单链表是否是”回文" ,返回1或0表示成功或失败
//字符栈,容量足够大
//设链表带头结点
//前一半字符入栈,链表指针后移
//若链表有奇数个结点,则跳过中间结点
//不是回文
2. 已知顺序表中有m 个记录,表中记录不依关键字有序排列,编写算法为该顺序表建立一个有序的索引表,索引表中的每一项含记录的关键字和该记录在顺序表中的序号,要求算法的时间复杂度在最好的情况下能达到O(m)。
【答案】算法如下:
顺序表中记录个数
关键字
该关键字在顺序表中的下标
索引表的一项
关键字
记录中的其他数据
给有m 个记录的顺序表seq 建立索引表
index
监视哨
关键字放入正确位置
第i 个记录的下标
3. 编程:假设以数组Q[m]存放循环队列中的元素,同时以rear 和length 分别指示环形队列中的队尾位置和队列中所含元素的个数。试给出该循环队列的队空条件和队满条件,并写出相应的初始化(initqueue),插入(enqueue)和删除(dequeue)元素的操作。
【答案】定义队列:
//循环队列占m 个存储单元
//rear指向队尾元素,length 为元素个数
(1)设cq 是seQueue 类型变量,则当(2)队列的初始化:
//cq为循环队列,本算法进行队列初始化
//算法结束 (3)队列的插入:
//cq是已如上定义的循环队列,本算法将元素x 入队
//队满
.
//计算插入元素位置
//将元素x 入队列
//修改队列长度
时队列空,当 时队列满。
//算法结束
(4)队列的删除:
//cq是已如上定义的循环队列,本算法是出队算法,且返回出队元素
//队空
;//出队元素位置
//修改队列长度
//返回队头元素
//算法结束
4. 在一个循环链队中只有尾指针(记为rear ,结点结构为数据域data ,指针域next) ,请给出这种队列的入队和出队操作的实现过程。
【答案】算法如下:
//rear是带头循环链队列的尾指针,本算法将元素X 插入到队尾
//申请结点空间
//将s 结点链入队尾
//rear指向新队尾
//rear是带头结点的循环链队列的尾指针
//本算法执行出队操作,成功输出队头元素;否则给出出错信息
//s指向队头元素
//队头元素出队
//空队列
5. 已知某哈希表HT 的装填因子小于1,哈希函数H(key)为关键字的第一个字母在字母表中的序号。
(1)处理冲突的方法为线性探测开放地址法。编写一个按第一个字母的顺序输出哈希表中所有关键字的程序。
(2)处理冲突的方法为链地址法。编写一个计算在等概率情况下查找不成功的平均查找长度的算法。注意,此算法中规定不能用公式直接求解计算。
【答案】(1)算法如下: