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

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 数组的值

}