1、初级程序员下午试题-52 及答案解析(总分:105.00,做题时间:90 分钟)一、B试题一/B(总题数:1,分数:15.00)阅读以下应用程序说明和 C 程序,将 C 程序段中(1)(6)空缺处的语句填写完整。【说明】某大学征询学生意见,从各学院预选的 n(n60)位优秀大学生中,评选出“十佳大学生”。以下【C 程序】对各位学生选票进行相关的统计、排序等处理。(1)各学院预选的优秀大学生按 1,2,顺序连续编号,每个编号用两个字符表示,即 01,02,。(2)所回收的选票按以下格式存于文件 source 中,每行字符串对应一张选票。其中,姓名占 10 个字符,学院名称占 30 个字符,大学生
2、编号占 20 个字符。(3)对应名次的大学生编号可以有空缺,但必须用 00 表示。(4)若编号超出规定范围,或编号重复出现,按照废票处理。(5)按选票中所列“十佳大学生”顺序给出各名大学生的得分。评分标准如下:一 二 三 四 五 六 七 八 九 十15 12 9 7 6 5 4 3 2 1(6)按各位大学生得分数由高到低顺序排队,并按以下格式列出“十佳大学生”排行表。名次 大学生编号 合计得分 合计得票数若得分相同,则得票数多的在前;若得分和得票数都相同,则编号小的在前。以下【C 程序】中所应用到的函数 fopen、fclose 和 fgets 都是 I/O 程序库中的函数。【C 程序】#in
3、clude stdio. h#define n 60long int tnn, tdn, scoren+110, ordern;char s80;int mark=(15,12,9,7,6,5,4,3,2,1);FILE *fp, *fopen();Main() int c, g, k, I, j, b10;long int e, d, t, tt, dd;char * p;for(i=0; i=n; i+)for(j=0; j10; j+)scoreij=0;fP=fopen(“source“, “r“); /*以读方式打开文件 source*/p=fgets(s, 80, fp); /*读
4、 fp 所指文件的下一行字符串于 s*/while(*p)g=l; k=0; p+=40;while(k10)c=(*p+)-0)*10+(*p+)-0);bk+=c)if(c=n)if(c) i=0;While(U (1) /U);If(U (2) /U)g=0; break;elseg=0; break;If(g)For(i=0; ik; i+)If(bi)U(3) /U;p=fgets(s, 80, fP);Fclose(fp); /*关闭 fp 所指文件*/For(i=1; in; i+)For(t=0, d=0, j=0; j10; j+)t +=(e=scoreij);d +=e
5、* markj;tni-1=t; tdi-1=d; orderi-1=i;For(i=0; in-1; i+)k=i;for(j=i+1; jn; j+)if(t=tdorderj-1)(d=tdorderk-1)k=j;elseif(t=d)tt=U (4) /U;dd=U (5) /U;for(c=0; c10; c+)if(e=U (6) /U)0)k=j; break;elseif(e0)break;If(k!=i)t=orderk; orderk=orderi; orderi=t;For(i=0; i10; i+)Printf(“%2d%2d%d%d/n“, i+1, orderi,
6、 tdorderi-1, tnorderi-1);(分数:15.00)(1).【问题 1】请将以上 C 程序段中,(1)(6)空缺处的语句填写完整。(分数:7.50)_(2).【问题 2】以上 C 程序段中,采用了哪种算法对大学生得分进行排序?(分数:7.50)_二、B试题二/B(总题数:1,分数:15.00)阅读以下技术说明和 C 语言代码,根据要求回答问题 1 至问题 6。【说明】有两个进程(编号分别为 0 和 1)需要访问同一个共享资源。为了解决竞争条件(race condition)的问题,需要实现一种互斥机制,使得在任何时刻只能有一个进程访问该共享资源。以下【C 代码 1】给出了一种
7、实现方法。【C 代码 1】int flag2; /+flag 数组,初始化为 FALSE*/Enter_Critical_Section(int my_task_id, int other_task_id) while (flagother_task_id=TRUE); /*空循环语句*/flagmy_task_id=TRUE;Exit_Critical_Section(int my_task_id, int other_task_id) flagmy_task_id=FALSE;当一个进程要访问临界资源时,就可以调用【C 代码 1】给出的这两个函数。【C 代码 2】给出了进程 0 的一个例子
8、。【C 代码 2】Enter_Critical_Section(0,1);使用这个资源Exit_Critical_Section(0,1);做其他的事情(分数:15.00)(1).【问题 1】什么是临界资源(critical resource)?请用 100 字以内的文字简要说明。(分数:2.50)_(2).【问题 2】【C 代码 1】所示的方法U (1) /U实现共享资源的互斥访问。(1) A能够 B不能(分数:2.50)_(3).【问题 3】【C 代码 1】采用了一种繁忙等待(busy waiting)的策略,这种策略的缺点是什么?请用 100 字以内的文字简要说明。(分数:2.50)_(
9、4).【问题 4】如果把 Enter_Critical_Section()函数中的两条语句互换一下位置,则可能会出现什么情况?(分数:2.50)_(5).【问题 5】 【C 代码 3】中 x,y 是两个已定义的整型变量。对该程序段进行覆盖测试时,必须适当地选取测试用例。如表 5-10 所示给出了可供选择的 4 组测试用例。若要实现语句覆盖,则至少应采用的测试用例是U (2) /U;若要实现条件覆盖,则至少应采用的测试用例是U (3) /U;若要实现路径覆盖,则至少应采用的测试用例是U (4) /U或U (5) /U。 【C 代码 3】 int a:=0; if (x=O struct ele
10、* next;elem;main(int argc, char * argv)FILE *fp; elem *h, *u, *proc();if(argc=2 fclose(fp);output(h);while(h I=NULL)u=h*next; free(h); h=u;elem * proc(FILE *fp)int n, m; elem *u, *v, *p, *base;base=NULL;fscanf(fp, “%d, while(!feof(fp)fscanf(fp, %d, for(v=base; v!=NULL u=v, v=v-next);if(U (1) /U)if(U
11、 (2) /U)base=v-next;elseu-next=v-next;v-q+=m;elsev=(elem *)malloc(Sizeof)elem);v-no=n; v-q=m; p=base;while(p !=NULL)if(U (3) /U)break;else u=p; p=p-next;if(U (4) /U)base=v;elseu-next=v;U (5) /U;Fscanf(fp, “%d“, return base;Output(elem *head)int count, order; elem *u, *v;printf(“ORDER QUANTITY COUNT
12、NUMBER/n“);u=head; order=1;while(u !=NULL)for(count=1, v=u-next; U(6) /U;count+, v=v-next);printf(“%4d%9d%6d“, order, u-q, count);order+=count;for(;U (7) /U;printf(“%4d“, u-no), u=u-next);printf(“/n“);(分数:15.00)_四、B试题四/B(总题数:1,分数:15.00)2.【说明】一般的树结构常采用孩子一兄弟表示法表示,即用二叉链表代表树的存储结构,链表中节点的两个链域分别指向该节点的第一个孩子
13、节点和下一个兄弟节点,例如,如图 5-9(a)所示的树和如图 5-9(b)所示的树的孩子一兄弟表示。(分数:15.00)_五、B试题五/B(总题数:1,分数:15.00)3.【说明】某绘图系统存在 Point、Line 和 Square 这三种图元,它们具有 Shape 接口,图元的类图关系如图 5-10 所示。(分数:15.00)_六、B试题六/B(总题数:1,分数:15.00)4.【说明】 某绘图系统定义了一个抽象类 Ishape,现有 3 个类 Cpoint,CLine 和 Ccircle,它们都具有IShape 界面。相应的类图关系如图 5-11 所示。 (分数:15.00)_七、B试
14、题七/B(总题数:1,分数:15.00)5.【说明】某绘图系统存在 Point、Line 和 Square 3 种图元,它们具有 Shape 接口,图元的类图关系如图 5-12 所示。(分数:15.00)_初级程序员下午试题-52 答案解析(总分:105.00,做题时间:90 分钟)一、B试题一/B(总题数:1,分数:15.00)阅读以下应用程序说明和 C 程序,将 C 程序段中(1)(6)空缺处的语句填写完整。【说明】某大学征询学生意见,从各学院预选的 n(n60)位优秀大学生中,评选出“十佳大学生”。以下【C 程序】对各位学生选票进行相关的统计、排序等处理。(1)各学院预选的优秀大学生按
15、1,2,顺序连续编号,每个编号用两个字符表示,即 01,02,。(2)所回收的选票按以下格式存于文件 source 中,每行字符串对应一张选票。其中,姓名占 10 个字符,学院名称占 30 个字符,大学生编号占 20 个字符。(3)对应名次的大学生编号可以有空缺,但必须用 00 表示。(4)若编号超出规定范围,或编号重复出现,按照废票处理。(5)按选票中所列“十佳大学生”顺序给出各名大学生的得分。评分标准如下:一 二 三 四 五 六 七 八 九 十15 12 9 7 6 5 4 3 2 1(6)按各位大学生得分数由高到低顺序排队,并按以下格式列出“十佳大学生”排行表。名次 大学生编号 合计得分
16、 合计得票数若得分相同,则得票数多的在前;若得分和得票数都相同,则编号小的在前。以下【C 程序】中所应用到的函数 fopen、fclose 和 fgets 都是 I/O 程序库中的函数。【C 程序】#include stdio. h#define n 60long int tnn, tdn, scoren+110, ordern;char s80;int mark=(15,12,9,7,6,5,4,3,2,1);FILE *fp, *fopen();Main() int c, g, k, I, j, b10;long int e, d, t, tt, dd;char * p;for(i=0;
17、i=n; i+)for(j=0; j10; j+)scoreij=0;fP=fopen(“source“, “r“); /*以读方式打开文件 source*/p=fgets(s, 80, fp); /*读 fp 所指文件的下一行字符串于 s*/while(*p)g=l; k=0; p+=40;while(k10)c=(*p+)-0)*10+(*p+)-0);bk+=c)if(c=n)if(c) i=0;While(U (1) /U);If(U (2) /U)g=0; break;elseg=0; break;If(g)For(i=0; ik; i+)If(bi)U(3) /U;p=fgets(
18、s, 80, fP);Fclose(fp); /*关闭 fp 所指文件*/For(i=1; in; i+)For(t=0, d=0, j=0; j10; j+)t +=(e=scoreij);d +=e * markj;tni-1=t; tdi-1=d; orderi-1=i;For(i=0; in-1; i+)k=i;for(j=i+1; jn; j+)if(t=tdorderj-1)(d=tdorderk-1)k=j;elseif(t=d)tt=U (4) /U;dd=U (5) /U;for(c=0; c10; c+)if(e=U (6) /U)0)k=j; break;elseif(e
19、0)break;If(k!=i)t=orderk; orderk=orderi; orderi=t;For(i=0; i10; i+)Printf(“%2d%2d%d%d/n“, i+1, orderi, tdorderi-1, tnorderi-1);(分数:15.00)(1).【问题 1】请将以上 C 程序段中,(1)(6)空缺处的语句填写完整。(分数:7.50)_正确答案:()解析:(1)c!=bi+,或其他等价形式 (2)ik,或其他等价形式 (3)scorebii+,或其他等价形式 (4)orderj (5)ordcrk (6)scorettc-scoreddc 要点解析 仔细阅读本
20、试题的程序说明和【C 程序】后,可得出评选“十佳大学生”的数据格式和算法。该 C 程序先读入一行字符,进行合法性检查后再进行选票统计;读入所有选票后,再计算每个大学生的得分和选票数,最后进行排序输出。 通常,阅读一个 C 程序时,应先明白程序中所用变量的含义,这对解题是很有帮助的。程序中所用变量的含义,除了可在程序说明中了解之外,还可以通过程序中的输入/输出语句来获知。对照程序说明中给出的输出次序可以了解到,数组 order 是用来存放第 i 名大学生的编号,数组 td 用来存放大学生的总分,数组 tn 用来存放大学生得到的选票总数。 程序中用 while(*p).语句所包含的程序段进行合法性
21、检查并进行统计。合法性检查即排除非法的选票。指针 p 用于表示每次读入的一行 80 个字符的首地址,语句“p+=40”使 p 指向每张选票的第 40 个字符,把每张选票上的大学生编号转换成十进制数 c,并存入数组b 中。由于每张选票最多可选十名,因此需用 k10 来进行循环控制。 由于(1)、(2)空缺处位于while(*p).的内循环中,且由语句“g=0; break;”(即变量 g 为 0 时跳出该循环)和语句“if(g)”可知,譬为合法性标记,因此(1)、(2)空缺处所填写的语句完成选票的合法性检查。由于非法选票有“编号超出规定范围”和“编号重复出现”两种,因此应当把当前编号 c 和已处
22、理过的编号 bi(i=0.k-1)进行比较,从而来判断是否满足“编号超出规定范围”,即(1)空缺处应填入“c!=bi+”。另外,当前编号 c 已存放在第 k 个字符中,当 i 小于 k 时,即表示有编号重复,因此(2)空缺处应填入“ik”。 (3)在空缺处的“for(i=0; ik; i+)”循环程序段中,数组 bi表示编号为 bi的大学生,在该张选票上被评为 i+1 名;数组 scorebii表示编号为 bi的大学生,被评为 i+1 名的选票有 scorebii张。当一张选票上的 10 个编号都合法时,则应把该选票上的数据存入数组 score 中,即对编号为 bi的大学生所得的第 i+1 名
23、选票加 1,因此(3)空缺处应填入“scorebii+”。 “fclose(fp);”之后的语句是对大学生的得分进行统计工作,其结果分别存放在大学生编号数组 Order、选票总数变量 tn 和总分变量 td 中,然后进行排序。由语句的结构可知,用变量 k 标记得分最高的位置,即编号为 orderk的大学生得分为本次排序中最高,然后在外层 for 循环中进行条件交换,由此可知,该排序采用的是选择排序算法。 在排序过程中如果得分相同,即程序中条件“if(t=d)”成立,则必须根据两名大学生的得票情况进行排序,得分名次在前、票数多者排在前面。(6)空缺处所填写的语句是对得票数相同的情况进行排序处理,
24、e 为控制变量,用来存放编号为 Orderj和 Orderk的相同名次的得票数的比较结果,并根据该比较结果确定是否进行位置交换。因此(4)空缺处所填写的内容是“orderj”;(5)空缺处所填写的内容是“orderk”;(6)空缺处所填写的内容是“scorettcscoreddc”,即编号为 j 的大学生与编号为 k 的大学生的得票数之差。(2).【问题 2】以上 C 程序段中,采用了哪种算法对大学生得分进行排序?(分数:7.50)_正确答案:()解析:选择排序算法 要点解析 由【问题 1】要点解析可知,该 C 程序段采用选择排序算法对大学生得分进行排序处理。二、B试题二/B(总题数:1,分数
25、:15.00)阅读以下技术说明和 C 语言代码,根据要求回答问题 1 至问题 6。【说明】有两个进程(编号分别为 0 和 1)需要访问同一个共享资源。为了解决竞争条件(race condition)的问题,需要实现一种互斥机制,使得在任何时刻只能有一个进程访问该共享资源。以下【C 代码 1】给出了一种实现方法。【C 代码 1】int flag2; /+flag 数组,初始化为 FALSE*/Enter_Critical_Section(int my_task_id, int other_task_id) while (flagother_task_id=TRUE); /*空循环语句*/flag
26、my_task_id=TRUE;Exit_Critical_Section(int my_task_id, int other_task_id) flagmy_task_id=FALSE;当一个进程要访问临界资源时,就可以调用【C 代码 1】给出的这两个函数。【C 代码 2】给出了进程 0 的一个例子。【C 代码 2】Enter_Critical_Section(0,1);使用这个资源Exit_Critical_Section(0,1);做其他的事情(分数:15.00)(1).【问题 1】什么是临界资源(critical resource)?请用 100 字以内的文字简要说明。(分数:2.50
27、)_正确答案:()解析:在多道程序系统中,各进程可以共享各类资源,但有些资源一次只能供一个进程使用。需要互斥访问的资源称为临界资源 要点解析 在多道程序系统中,各进程可以共享各类资源,但有些资源一次只能供一个进程使用。需要互斥访问的资源称为临界资源(Critical Resource),如打印机、共享变量和表格等。(2).【问题 2】【C 代码 1】所示的方法U (1) /U实现共享资源的互斥访问。(1) A能够 B不能(分数:2.50)_正确答案:()解析:B 或不能 要点解析 【C 代码 1】所示的方法不能实现资源的互斥访问。例如,考虑如下的情形。1)初始化的时候,flag 数组的两个元素
28、值均为 FALSE: 2)进程 0 先执行,在执行 while 循环语句时,由于 flag1=FALSE,所以程序顺利结束,不会被卡住,假设此时出现一个时钟中断,打断它的运行; 3)进程 1 去执行,在执行 while 循环语句时,由于 flag0=FALSE,所以程序顺利结束,不会被卡住,然后就进入了临界区; 4)当进程 0 再执行时,也进入了临界区,这样就同时有两个进程在临界区。(3).【问题 3】【C 代码 1】采用了一种繁忙等待(busy waiting)的策略,这种策略的缺点是什么?请用 100 字以内的文字简要说明。(分数:2.50)_正确答案:()解析:由于该算法策略每个任务进程
29、要循环地去判断当前能否访问临界资源,因此会浪费大量的 CPU 时间,而且如果设计不合理,容易导致死锁 要点解析 本题考查的是进程之间的互斥问题,即基于繁忙等待(Busy Waiting)的进程互斥实现方法。其基本思路是,当一个进程要进入临界区,首先需要检查是否允许它进入,若允许,则直接进入;否则,则循环等待。 在多道程序系统中,各个进程是并发执行的,由于时钟中断的原因,使进程之间的执行顺序变得难以预测,每个进程都有可能在任意一条语句的后面被中断。在这种情况下,如果要采用基于繁忙等待的互斥实现方法,就必须考虑所有的可能情况,即如果每个进程在不同的位置被中断时,能否正确地实现进程间互斥。 由于该算
30、法策略需要使用一个循环语句不断执行测试指令,即每个进程要循环地判断当前能否访问临界资源,因此会浪费大量的 CPU 时间,而且如果设计不合理,容易导致死锁。(4).【问题 4】如果把 Enter_Critical_Section()函数中的两条语句互换一下位置,则可能会出现什么情况?(分数:2.50)_正确答案:()解析:可能会出现死锁 要点解析 在“Enter_Critical_Section(int my_task_jd, int other_task_id)”函数中,已提示“while(flagother_task_id=TRUE);”是一条空循环语句。如果将它调到“flagmy_task
31、_id=TRUE;”语句之后,将导致程序进入死锁状态。(5).【问题 5】 【C 代码 3】中 x,y 是两个已定义的整型变量。对该程序段进行覆盖测试时,必须适当地选取测试用例。如表 5-10 所示给出了可供选择的 4 组测试用例。若要实现语句覆盖,则至少应采用的测试用例是U (2) /U;若要实现条件覆盖,则至少应采用的测试用例是U (3) /U;若要实现路径覆盖,则至少应采用的测试用例是U (4) /U或U (5) /U。 【C 代码 3】 int a:=0; if (x=O struct ele * next;elem;main(int argc, char * argv)FILE *f
32、p; elem *h, *u, *proc();if(argc=2 fclose(fp);output(h);while(h I=NULL)u=h*next; free(h); h=u;elem * proc(FILE *fp)int n, m; elem *u, *v, *p, *base;base=NULL;fscanf(fp, “%d, while(!feof(fp)fscanf(fp, %d, for(v=base; v!=NULL u=v, v=v-next);if(U (1) /U)if(U (2) /U)base=v-next;elseu-next=v-next;v-q+=m;e
33、lsev=(elem *)malloc(Sizeof)elem);v-no=n; v-q=m; p=base;while(p !=NULL)if(U (3) /U)break;else u=p; p=p-next;if(U (4) /U)base=v;elseu-next=v;U (5) /U;Fscanf(fp, “%d“, return base;Output(elem *head)int count, order; elem *u, *v;printf(“ORDER QUANTITY COUNT NUMBER/n“);u=head; order=1;while(u !=NULL)for(
34、count=1, v=u-next; U(6) /U;count+, v=v-next);printf(“%4d%9d%6d“, order, u-q, count);order+=count;for(;U (7) /U;printf(“%4d“, u-no), u=u-next);printf(“/n“);(分数:15.00)_正确答案:()解析:(1)v!=NULL)和该职工完成的产品数量信息(即 fscanf(fp, “%d“, ),从而形成一个按照产品数量和工号排序的职工有序链表。例如输入一个工号为 n 的职工的全部信息后,就利用指针 v 从链表的首节点开始顺序搜索满足条件(即工号等于
35、 n)的节点,这个过程依赖 for 循环语句(即 for(v=base; v !=NuLL u=v,v=v-next);)的实现。当循环条件 v!=NULL 且 v-no!=n 为真时,说明指针 v 指向的当前节点存在但却不是满足条件的节点,所以指针 v 通过语句u=v,v=v-next 实现向后移动,继而指向下一个节点,然后再重复上述的判断、移动过程,直到找到满足条件的节点或确定链表中根本不存在这样的节点为止。由于这两种结果不能同时发生,所以 for 循环后的 if. else 条件语句,先要对上述查找过程可能产生的两种结果做出选择,然后再决定继续执行的操作。又由于在 if 条件为真的情况下
36、,要执行的复合语句中包含累计产品数量的语句(即 v-q+=m;),所以可判断出程序首先是对链表中存在的刚输入职工的工号的情况进行处理,因此(1)空缺处所填写的内容是“v!=NULL&v-no=n”或其他等价形式。 根据上述链表中存在刚输入职工工号的情况,需要重新对该工号职工进行产品数量的累计,从而改变原来链表的有序性,为此应该对链表中的节点重新进行排序。那么,该程序的排序操作可以看成是一组删除、查找和插入操作的组合操作。 首先,将链表中满足条件(即工号为 n)的节点 v 删除。删除分为两种情况:当删除的节点是链表的首节点,即 v 与 base 同指向一个节点时,需改变链表的头指针,让它指向首节
37、点的直接后继节点,因此(2)空缺处所填写的内容是“v=base”或其他等价形式;当删除的节点是链表中的其他节点时,需改变链表中要删除节点的直接前驱节点的后继指针。 其次,在有序链表中为上述被删除的节点 v 寻找合适的插入位置。插入位置是根据待插入的节点(即上述被删除的节点)中产品累计数量的多少及工号的大小与链表中现存节点进行比较确定的。根据它们的比较结果,插入位置可以有以下 3 种情况(令指针 p 指向链表中正在与待插入节点进行比较的节点,而指针 u 用来指向其直接前驱节点)。 1)指针 p 所指向节点的 q 值(即产品累计数量)小于待插入节点 v 的 q 值(即产品累计数量),于是将节点 v
38、 插入到 p 所指向的节点之前。 指针 p 所指向节点的q 值与待插入节点 v 的 q 值相等,但前者的 no 值(即工号)大于后者的 no 值,于是将节点 v 插入到 p 所指向的节点之前。 指针 p 所指向节点的 q 值比待插入节点 v 的 q 值都大,于是一直向后寻找,直到p=NULL 为止,这时指针 u 指向链表中的最后一个节点,因而将节点 v 插入到链表的尾部,即成为节点 U的直接后继。 由以上分析可知,(3)空缺处所填写的内容是“p-qv-q | p-q=v-q & p-non-no”或其他等价形式。由于以上分析中前两种情况都属于在指针 p 所指向节点之前插入节点v,因此要考虑一个
39、关键的插入位置,以及是否在首节点之前插入,即(4)空缺处所填写的内容是“p=base”或其他等价形式,(5)空缺处所填写的内容是“v-next=p”或其他等价形式。 函数output()完成的功能是按照指定的格式输出。(6)空缺处所在的 for 循环实现了相同 q 值的节点个数的统计,这些节点按照工号从小到大的顺序形成一个有序链表段。为了使表达式正确计算,(6)空缺处需要填入“v!=NULL & v-q=u-q”或其他等价形式。 由于(7)空缺处所在的 for 循环实现了有相同产品个数的职工工号的顺序输出,因此(7)空缺处所填写的内容是“count-!=0(或 u!=v)”或其他等价形式。四、
40、B试题四/B(总题数:1,分数:15.00)2.【说明】一般的树结构常采用孩子一兄弟表示法表示,即用二叉链表代表树的存储结构,链表中节点的两个链域分别指向该节点的第一个孩子节点和下一个兄弟节点,例如,如图 5-9(a)所示的树和如图 5-9(b)所示的树的孩子一兄弟表示。(分数:15.00)_正确答案:()解析:(1)EnQueue(&tempQ,root) (2)brotherptr=brotherptr-nextbrother (3)!IsEmpty(tempQ),或其等价形式 (4)DeQueue(&tempQ,&ptr) (5)!ptr-firstchild,或其等价形式 (6)EnQ
41、ueue(&tempQ,ptr-firstchild) (7)brotherptr=brotherptr-nextbrother 要点解析 这是一道要求读者掌握树结构的存储及遍历运算的程序分析题。本试题的解答思路如下。 队列可以保证访问节点时按照层次和自左至右的顺序。借助队列结构对树进行层序遍历时,每个节点都进出队列一次,节点出队列时进行访问。其过程是,首先令树根节点入队,若是森林(树根之间互为兄弟),接着则令其余树的根节点入队,然后在队列非空的情况下,队头节点出队,访问该节点同时令其孩子节点入队。依此类推,直到队列为空。 在试题所给出的【C 函数程序】中,代码“InitQueue(&tempQ);U (1) /U;”完成初始化队列并令根节点入队列的功能,因此(1)空缺处所填写的内容是“EnQueue(&tempQ,root)”。 采用二叉树存储树结构时,其右分支表示兄弟关系,因此队头节点出队时,应沿右分支将队头节点
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1