[计算机类试卷]软件水平考试中级软件设计师下午应用技术(数据结构与算法应用)模拟试卷1及答案与解析.doc
《[计算机类试卷]软件水平考试中级软件设计师下午应用技术(数据结构与算法应用)模拟试卷1及答案与解析.doc》由会员分享,可在线阅读,更多相关《[计算机类试卷]软件水平考试中级软件设计师下午应用技术(数据结构与算法应用)模拟试卷1及答案与解析.doc(12页珍藏版)》请在麦多课文档分享上搜索。
1、软件水平考试中级软件设计师下午应用技术(数据结构与算法应用)模拟试卷 1及答案与解析 一、选答题(共 3道大题,每道大题 15分) 从下列 3道试题中任选 1道解答,如果解答的试题数超过 1道,则仅题号小的 1道题解答有效。 1 一般的树结构常采用孩子 -兄弟表示法表示,即用二叉链表作为树的存储结构,链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点。例如,如图 15-1(a)所示的树的孩子兄弟表示如图 15一 1(b)所示。 函数LevelTraVerse()的功能是对给定树进行层序遍历。例如,当对图 15 1(a)中的树进行层序遍历时,结点的访问次序为 DBAEFPC。 对
2、树进行层序遍历时使用了队列结构,实现队列基本操作的函数原型如表 15一 1所示。 Bool、 Status类型定义如下: typedef enumFALSE=0, TRUE=1)Bool; typedef enumOVERFLOW=一 2,UNDERFLOW=一 1, ERROR=0, OK=1Status;树的二叉链表结点定义如下:typedef struct Node char data; struct Node*firstchild, *nextbrother; Node,*TreeNode;【函数代码】 Status LevelTraverse(TreeNode root) *层序遍历
3、树,树采用孩子一兄弟表示法, root是树根结点的指针 * Queue temQ ; TreeNode ptr, brOtherptr; if(!root)return ERROR; InitQueue(&tempQ); (1); brotherptr=root一 nextbrother; while( brotherptr ) EnQueue( tempQ, brotherptr); (2), *end-while* while( (3) ) (4), printf(” c t”, ptr一 data); if( (5) )continue; (6), brotherptr=ptr一 fir
4、stchild一 nextbrother; while(brotherptr) EnQueue(&tempQ, brotherptr); (7); *endwhile* *end-while* return OK; *LevelTraverse* 2 函数 int Toplogical(LinkedWDigraph G)的功能是对图 G中的顶点进行拓扑排序,并返回关键路径的长度。其中图 G表示一个具有 n个顶点的 AOE网,图中顶点从1 n依次编号,图 G的存储结构采用邻接表表示,其数据类型定义如下: typedef struct Gnode *邻接表的表结点类型 * int adj vex;
5、 *邻接顶点编号 * int weight; *弧上的权值 * struct Gnode*nextarc; *指示下一个弧的结点 * Gnode; typedef struct Adj list *邻接表的头结点类型 * char vdata; *顶点的数据信息 * struct Gnode*Firstadj; *指向邻接表的第一个表结点 * Adjulist; typedef struct LinkedWDigraph *图的类型 * int n, e; *图中顶点个数和边数 * struct Adj list*head; *旨向图中第一个顶点的邻接表的头结点 * LinkedWDigrap
6、h; 例如,某 AOE网如图 15-2所示,其邻接表存储结构如图15-3所示。 【函数代码】 int Toplogical(LinkedWDigraph G)Gnode*p; int j r W r top=0; int*Stack, *ve, *indegree; ve=(int*)malloc(G n+1)*sizeof(int);indeqree=(int*)malloc(G n+1)*sizeof(int); *存储网中各项点的入度 * Stack:(int*)malloc(G n+1)*sizeof(int); *存储入度为 0的顶点的编号 *if(!ve !indegree !St
7、ack) exit(0); for(J=1; jnextarc; *while* *for* for(j=1; j0) W= (2); printf(“ c”, G headw vdata); P=G headw Firstadj; while(P) (3) ; if(!indegreep一 adjvex) Stack+top=P一 adjvex; if( (4) ) vep一 adjvex=vew+p一 weight; p=P一 nextarc; *while* *while* return (5) ; *Toplogical* 3 快速排序是一种典型的分治算法。采用快速排序对数组 Ap r
8、排序的三个步骤如下: 分解:选择一个枢轴 (pivot)元素划分数组。将数组 Ap r划分为两个子数组 (可能为空 )Ap q一 1和 Aq+l_ r,使得 Aq大于等于 Alp q-1中的每个元素,小于 Aq+1 r中的每个元素。 q的值在划分过程中计算。 递归求解:通过递归的调用快速排序,对子数组 Apq一 1和 Aq+1 r分别排序。 合并:快速排序在原地排序,故不需合并操作。 【问题 1】 下面是快速排序的伪代码,请填补其中的空缺。伪代码中的主要变量说明如下: A:待排序数组。 P, r:数组元素下标,从 P到 r。 q:划分的位置。 x:枢轴元素。 i:整型变量,用于描述数组下标。下
9、标小于或等于 i的元素的值小于或等于枢轴元素的值。 j循环控制变量,表示数组元素下标。 QUICKSORT(A, p, r) if (pn一 1) *得到问题解 * beStW=cw; bestC=cp; for(j=0; j 4 阅读下列说明和 C代码,回答问题 1问题 3,将解答写在答题纸的对应栏内。 【说明】 设有 n个货物要装入若干个容量为 C的集装箱以便运输,这 n个货物的体积分别为 S1, S2, , Sn,且有 siC(1in)。为节省运输成本,用尽可能少的集装箱来装运这 n个货物。 下面分别采用最先适宜策略和最优适宜策略来求解该问题。 最先适宜策略 (Firstfit)首先将所
10、有的集装箱初始化为空, 对于所有货物,按照所给的次序,每次将一个货物装入第一个能容纳它的集装箱中。 最优适宜策略 (Bestfit)与最先适宜策略类似,不同的是,总是把货物装到能容纳它且目前剩余容量最小的集装箱,使得该箱子装入货物后闲置空间最小。 【 C代码】 下面是这两个算法的 C语言核心代码。 (1)变量说明。 n:货物数。 C:集装箱容量。 s:数组,长度为 n,其中每个元素表示货物的体积,下标从 0开始。 b:数组,长度为 n, bi表示第 i+1个集装箱当前已经装入货物的体积,下标从0。 i, j:循环变量。 k:所需的集装箱数。 min:当前所用的各集装箱装入了第 i个货物后的最小
11、剩余容量。 m:当前所需要的集装箱数。 temp:临时变量。 (2)函数 firstfit。 int firstfit() inti, j; k=0: ; for(i=0; i(j+1)?k: (j+1); returnk (3)函数 bestfit。 int bestfit() int i , j f min t m t temp; k=0; for(i=0; iO &temp(m+1)?k: (m+1); return k: 5 根据【说明】和【 C代码】,填充 C代码中的空 (1) (4)。 6 根据【说明】和【 C代码】,该问题在最先适宜和最优适宜策略下分别采用了 (5)和 (6)算法
12、设计策略,时间复杂度分别为 (7)和 (8) (用 0符号表示 )。 7 考虑实例 n=10, C=10,各个货物的体积为 4, 2, 7, 3, 5, 4, 2, 3, 6, 2。该实例在最先适宜和最优适宜策略下所需的集装箱数分别为 (9) 和 (10)。考虑一般的情况,这两种求解策略能否确保得到最优解 ? (11) (能或否 )。 软件水平考试中级软件设计师下午应用技术(数据结构与算法应用)模拟试卷 1答案与解析 一、选答题(共 3道大题,每道大题 15分) 从下列 3道试题中任选 1道解答,如果解答的试题数超过 1道,则仅题号小的 1道题解答有效。 1 【正确答案】 (1)EnQueue
13、(&tempQ, root)。 (2)brotherptr=brotherptr-nextbrother。 (3)!IsEmpty(tempQ)。 (4)DeQueue(&tempQ, &ptr)。 (5)!ptr-firstchild。 (6)EnQueue(&tempQ, ptr-firstchild)。 (7)brotherptr=brotherptr-nextbrother。 【试题解析】 解答此题的关键在于理解用队列层序遍历树的过程。算法的流程是这样的:首先将树根结点入队,然后将其所有兄弟结点入队 (当然,由于是根结点,故无兄弟结点 );完成这一操作以后,便开始出队、打印;在打印完了
14、之后,需要进行一个判断,判断当前结点有无孩子结点,若有孩子结点,则将孩子结点入队,同时将孩子结点的所有兄弟结点入队;完了以后继续进行出队操作,出队后再次判断当前结点是否有孩子结点,并重复上述过程,直至所有结点输出。 这一描述可能过于理论,难以理解,接下来以本题为例来说明此过程。首先将树根结点 D入队,并同时检查是否有兄弟结点,对于兄弟结点应一并入队。这里的 D没有兄弟结点,所以队列此时应是: D 接下来执行出队操作。 D出队,出队以后检查 D是否有子结点,经检查, D有子结点 B,所以将 B入队,同时将 B的兄弟结点: A和 E按顺序入队。得到队列: B A E 接下来再执行出队操作。 B出队
15、,同时检查 B是否有子结点, B无子结点,所以继续执行出队操作。 A出队,同时检查 A是否有子结点, A有子结点 F,所以将 F入队,同时将 F的兄弟结点 P入队。得到队列: E F P 接下来再次执行出队操作。 E出队, E有子结点 C,所以 C入队。得: F P C 接下来再次执行出队操作。 F出队, F无子结点,继续出队操作, P出队,仍无子结点,最后 C出队,整个过程结束。 通过对算法的详细分析,现在便可轻松得到答案。 (1)应是对根结点 root执行入队操作,即 EnQueue(&tempQ, root)。 (2)在一个循环当中,循环变量是brotherptr,此变量无语句对其进行更
16、新,所以 (2)必定是更新 brotherptr。结合前面的算法 分析可知 (2)应填: brotherptr=brotherptr-nextbrother。 (3)、 (4)加上后面的语句 “printf(“ c t”, ptr-data); ”是控制数据的输出,这些数据应是从队列中得到,所以此处必有出队操作,同时在出队之前应判断队列是否为空,所以(3)、 (4)填: !IsEmpty(tempQ)和 DeQueue(&tempQ, &ptr)。 (5)实际上是问 “在什么情况下,要持续进行出队操作 ?”,前面的算法分析中已指出:若出队结点无子结点,则继续进行出队操作,所以 (5)填 !pt
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
2000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 试卷 软件 水平 考试 中级 设计师 下午 应用技术 数据结构 算法 应用 模拟 答案 解析 DOC

链接地址:http://www.mydoc123.com/p-506731.html