2017年武汉科技大学数据结构(C语言版)复试实战预测五套卷
● 摘要
一、应用题
1. 请阅读下列算法,回答问题。
问题一:这是什么类型的排序算法,该排序算法稳定吗? 问题二:设置
|的作用是什么? 若将WHILE--DO 语句中判断条件改为
该
算法将会有什么变化,是否还能正确工作?
【答案】问题一:此为直接插入排序算法,该算法稳定。 问题二:采用
的作用是监视哨,免去每次检测文件是否到尾,提高了排序效率。
描述算法后,算法变为不稳定排序,但能正常工作。
2. 将算术表达式((a+b)+c*(d+e)+f)*(g+h)转化为二叉树。
【答案】该算术表达式转化的二叉树如图所示。
图
3. 系统中有多个生产者进程和消费者进程,,共享用一个可以存1000个产品的缓冲区(初始为空)当缓冲区为未满时,生产者进程可以放入一件其生产的产品,否则等待;当缓冲区为未空时,消费者进程可以取走一件产品,否则等待。要求一个消费者进程从缓冲区连续取出10件产品后,其
他消费者进程才可以取产品,请用信号量
求写出完整的过程;并指出所用信号量的含义和初值
【答案】设置5个信号量
empty :表示缓冲区是否为空,初值为1000 full :
表示缓冲区是否为满,初值为0
mutex 1:生产者之间的互斥信号,初值为1 mutex2:消费者之间的互斥信号,初值为1 available :当前消费者能否访问缓冲区,初值为1
操作实现进程间的互斥和同步,要
定义变量in , out 分别为生产者和消费者进程所要使用的指针,指向下一个可用的缓冲区单元,MaXNum= 1000 为缓冲区的大小,count 标志当前消费者已经取的产品的数量,初值为0
生产者进程:
生产一个产品;
产品送入buffer (in );
消费者进程
取出产品buffer (out );
4. 假定在一个8位字长的计算机中运行下列C 程序段:
若编译器编译时将8个8位寄存器R1〜R8分别分配给变量回答下列问题。(提示:带符号整数用补码表示)
(1)执行上述程序段后,寄存器Rl 、R5和R6的内容分别是什么?(用十六进制表示) (2)执行上述程序段后,变量m 和kl 的值分别是多少?(用十进制表示)
(3)上述程序段涉及带符号整数加/减、无符号整数加/减运算,这四种运算能否利用同一个加法器及辅助电路实现? 简述理由。
(4)计算机内部如何判断带符号整数加/减运算的结果是否发生溢出? 上述程序段中,哪些带符号整数运算语句的执行结果会发生溢出?
【答案】(1)无符号整数运算,(Rl ) =x=134=10000110B=86H、(R5)=x-y=246=10010000B=90H、(R6)=x+y=01111100B=7CH。
(2) m 的机器数与x 的机器数相同为86H=1000 0110B,解释为带符号整数(用补码表示)时,其值为-111 1010B= -112; 同理kl=(m-n )=(x-y )=90H=1001 0000B,解释为带符号整数(用补码表示)时,其值为-111 1010B=-112;
(3)四种运算可以利用同一个加法器及辅助电路实现,n 位加法器实现的是模2n 无符号整数加法运算。对于无符号整数a 和b , a+b可以直接用加法器实现,而
实现;
对于带符号整数用补码表示,补码加减运算公式为
:
,所以四种运算都可在n 位加法器
中实现。
(4)判断溢出的方法有3种:一位符号位、进位位和双符号位。上述程序段中只有
语句会发 生溢出,因为2个带符号整数均为负数,它们相加之后,结果小于8位二进制所能表示的最小负数。
5. 在改进了的(无回溯)字符串模式匹配中,要先求next 数组的值。下面是求nextval 值的算法。
{在模式P 中求nextval 数组的值
}
请