[语言类考试复习资料大全]中级软件设计师下午试题分类模拟15_第1页
[语言类考试复习资料大全]中级软件设计师下午试题分类模拟15_第2页
[语言类考试复习资料大全]中级软件设计师下午试题分类模拟15_第3页
[语言类考试复习资料大全]中级软件设计师下午试题分类模拟15_第4页
[语言类考试复习资料大全]中级软件设计师下午试题分类模拟15_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、书山有路勤为径,学海无涯苦作舟。祝愿天下莘莘学子:学业有成,金榜题名!语言类考试复习资料大全中级软件设计师下午试题分类模拟15中级软件设计师下午试题分类模拟15试题一阅读下列说明、图和C代码,填入横线处的字句。问题:1. 说明1 B树是一种多又平衡查找树。一棵m阶的B树,或为空树,或为满足下列特性的m叉树。 (1)树中每个节点至多有m棵子树。 (2)若根节点不是叶子节点,则它至少有两棵子树。 (3)除根之外的所有非叶子节点至少有m/2棵子树。 (4)所有的非叶子节点中包含下列数据信息:(n,A0,K1,A1,K2,A2,Kn,An)。其中,Ki(i=1,2,n)为关键字,且KiKi+1(i=1

2、,2,n-1),Ai(i=0,1,n)为指向树根节点的指针,且指针Ai-1所指子树中所有节点的关键字均小于ki,Ai+1所指子树中所有节点的关键字均大于ki;n为节点中关键字的数目。 (5)所有的叶子节点都出现在同一层次上,并且不带信息(可以看作是外部节点或查找失败的节点,实际上这些节点不存在,指向这些节点的指针为空)。 例如,一棵4阶B树如图1所示(节点中关键字的数目省略)。 B树的阶M、bool类型、关键字类型及B树节点的定义如下: #define M 4 /*B树的阶*/ typedef enum FALSE=0, TRUE=1 bool; typedef int ElemKeyType

3、; typedef Struct BTreeNode int numkeys; /*节点中关键字的数目*/ struct BTreeNode *parent; /*指向父节点的指针,树根的父节点指针为空*/ struct BTreeNode *AM; /*指向子树节点的指针数组*/ ElemgeyType KM; /*存储关键字的数组,K0闲置不用*/ BTreeNode; 函数SearchBtree(BTreeNode* root, ElemKeyType akey, BTreeNode *ptr)的功能是:在给定的一棵M阶B树中查找关键字akey所在节点,若找到则返回TRUE,否则返回FA

4、LSE。其中,root是指向该M阶B树根节点的指针,参数ptr返回akey所在节点的指针,若akey不在该B树中,则ptr返回查找失败时空指针所在节点的指针。例如,在图1所示的4阶B树中查找关键字25时,ptr返回指向节点e的指针。 注:在节点中查找关键字akey时采用二分法。 函数SearchBtree的代码如下: bool SearchBtree (BTreeNode* root, ElemKeyType akey, BTreeNode *ptr) int lw, hi, mid; BTreeNode *P=root; *ptr=NULL; while(p) lw=1; hi=_; whi

5、le (lw=hi) mid=(lw+hi)/2; if (p Kmid = akey) *ptr=P; return TRUE; else if _ hi = mid - 1; else lw=mid+1; *ptr=p; p=_; return FALSE; 答案:pnumkeys或其等价形式 pKmidakey或其等价形式 pAhi或pAlw-1或其等价形式 问题:2. 说明2 在M阶B树中插入一个关键字时,首先在最接近外部节点的某个非叶子节点中增加一个关键字,若该节点中关键字的个数不超过M-1,则完成插入;否则,要进行节点的“分裂”处理。所谓“分裂”,就是把节点中处于中间位置上的关键字

6、取出来并插入其父节点中,然后以该关键字为分界线,把原节点分成两个节点。“分裂”过程可能会一直持续到树根,若树根节点也需要分裂,则整棵树的高度增1。 例如,在图1所示的B树中插入关键字25时,需将其插入节点e中。由于e中已经有3个关键字,因此将关键字24插入节点e的父节点b中,并以24为分界线将节点e分裂为e1和e2两个节点,结果如图2所示。 函数Isgrowing(BTreeNode* root, ElemKeyType akey)的功能是:判断在给定的M阶B树中插入关键字akey后,该B树的高度是否增加,若增加则返回TRUE,否则返回FALSE。其中,root是指向该M阶B树根节点的指针。

7、在函数Isgrowing中,首先调用函数SearchBtree查找关键字akey是否在给定的M阶B树中,若在则返回FALSE(表明无需插入关键字akey,树的高度不会增加);否则,通过判断节点中关键字的数目考查插入关键字akey后该B树的高度是否增加。 函数lsgrowing的代码如下: bool Isgrowing(BTreeNode* root, ElemKeyType akey) BTreeNode *t, *f; if (!SearchBtree (_) t=f; while (_) t = t parent; if (!t) return TRUE; return FALSE; 答案

8、:root,akey, struct BucketNode *Link; BUCKET; BUCKET Bucket P; /*基桶空间定义*/ 函数InsertToHashTable代码如下: int InsertToHashTable(int NewElemKey) /*将元素NewElemKey插入散列桶中,若插入成功则返回0,否则返回-1*/ /*设插入第一个元素前基桶的所有KeyData、Link域已分别初始化为NULLKEY、NULL*/ int Index; /*基桶编号*/ int i, k; BUCKET *s, *front, *t; _; for (i = 0; i IT

9、EMS; i+) /*在基桶查找空闲单元,若找到则将元素存入*/ if (BucketIndex. KeyDatai = NULLKEY) BucketIndex. KeyData i = NewElemKey; break; if (_) return 0; /*若基桶已满,则在溢出桶中查找空闲单元,若找不到则申请新的溢出桶*/ _; t = Bucket Index. Link; if (t != NULL) /*有溢出桶*/ while (t !=NULL) for (k=0; kITEMS; k+) if (tKeyData k = NULLKEY) /*在溢出桶链表中找到空闲单元*/

10、 tKeyData k = NewElemKey; break; /*if*/ front=t; if (_)t = t; Link; else break; /*while*/ /*if*/ if (_) /*申请新溢出桶并将元素存入*/ s = (BUCKET *) malloc (sizeof (BUCKET); if (!s) return -1; sLink = NULL; for (k=0; kITEMS; k+) sKeyData k = NULLKEY; SKeyData0=NewElemKey; _; /*if*/ return 0; /*InsertToHashTable*

11、/ 答案:Index=NewElemKey%P或Index=Hash(NewElemKey) iITEMS front= struct DocExplorer func update; /*DocExplorer结构采用的更新函数*/ /*其他的结构字段省略*/ ; Struct OfficeDoc _ myObsOBS_MAXNUM; /*存储所有与OfficeDoc相关联的DocExplorer结构指针*/ int index; /*与OfficeDoc结构变量相关联的DocExplorer结构变量的个数*/ ; Void attach (struct OfficeDoc *doc, st

12、ruct DocExplorer *ob) /*关联Obersver结构ob与OfficeDoc结构doc*/ int loop = 0; if (docindex =OBS_MAXNUM | ob = NULL) return; for (loop=0; loopdocindex; loop+) if (docmyObs loop = ob) return; docmyObs docindex = ob; docindex+; void detach (struct OfficeDoc *doc, struct DocExplorer *b) /*解除doc结构与ob结构间的关系*/ int

13、 loop; if (ob = NULL) return; for (loop = 0; loop doc index; loop+) if (docmyObs loop = ob) if (loop =docindex-2) docmyObs loop = docmyObs _; docmyObsdocindex-1 = NULL; docindex-一j break; void update1 (struct OfficeDoc *doc, struct DocExplorer *ob) /*更新ob结构的值,更新代码省略*/ void update2 (struct OfficeDoc

14、*doc, struct DocExplorer *ob) /*更新ob结构的值,更新代码省略*/ void notifyObs (struct OfficeDoc *doc) /*当doc结构的值发生变化时,通知与之关联的所有DocExplorer结构变量*/ int loop; for (loop = 0; loop docindex; loop+) (docmyObs loop)update(_); void main() struct OfficeDoc doc; /*定义一个OfficeDoc变量*/ struct DocExplorer explorer1, explorer2;

15、/*定义两个DocExplorer变量*/ /*初始化与OfficeDoc变量相关的DocExplorer变量个数为0*/ doc. index=0; explorer1. update = update1; /*设置explorer1 变量的更新函数*/ explorer2. update = update2; /*设置explorer2 变量的更新函数*/ attach ( /*关联explorer1与doc对象*/ attach ( /*关联explorer2与doc对象*/ /*其他代码省略*/ _; /*通知与OfficeDoc相关的所有DocExploer变量*/ return;

16、答案:*func struct DocExplorer* docindex-1 doc,docmyObsloop notifyObs( int flgN; sum (int i, int total, int sigma, int rear, int d, int t) int j; /* 考虑元素di被包含在新的部分元素序列中的可能性 */ if (sigma + di =total) /*如果di与当前序列的和不超过total*/ flgi=1;/* di被考虑在部分元素序列中 */ if (_=total) /* 输出解 */ for (j=0; flgj = 0; j+) printf

17、 (%4d = %d, total,dj); for (j+; j =i; j+) if (flgj) printf (+%d, dj); printf(); else if(i n-1 rear+sigma =total) /* 并且继续考虑后面的元素有可能找到解答时 */ sum (i+1, total, _, rear-di, d, n); _; /* 考虑元素di不被包含在新的部分元素序列中的可能性*/ if (i n-1 rear-di+tigma =total) sum(i+1, total, _, rear-di, d, n); main() int i, j, n, total, s, d; printf (输入 total! /n); sc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论