ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:181.80KB ,
资源ID:7661920      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7661920.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构毕业课程设计实验报告.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构毕业课程设计实验报告.docx

1、数据结构毕业课程设计实验报告(此文档为word格式,下载后您可任意编辑修改!)20122013学年第一学期实践教学课程名称:数据结构课程实践指导教师:钱峰专业班级:2011级 软件工程4班教学部门:计算机学院北京理工大学珠海学院课程设计说明书20122013 学年第一学期题 目: B树与B+树及其操作 学 院: 计算机学院 专业班级: 软工四班 学 号: 学生姓名: 宁 琳 琳 指导教师: 钱 峰 成 绩: 时 间: 2012年 10 月 16 日课程设计成绩评定表姓 名成绩评定权重总分总成绩(五分制)平时成绩20报告成绩50答辩成绩30B树与B+树及其操作摘 要通过学习B树的相关知识了解B树

2、的性质以及B树的构建、查找、插入、删除等操作,能用C或C+语言写出相关代码,并编译演示成功。关键词:B树的构建、查找、插入、删除结点分裂目 录摘要4概要设计61.数据结构设计62.算法设计73.ADT描述74.功能模块分析7详细设计91. 主要算法流程图92. 数据存储结构设计123. 界面设计13参考文献14心得体会15教师评语16计算机学院课程设计答辩记录表17附录18概要设计1.数据结构设计 B树又称为多路平衡查找树。一棵度为m的B树称为m阶B树。一个结点有k个孩子时,必有k-1个关键字才能将子树中所有关键字划分为k个子集。B树中所有结点的孩子结点最大值称为B树的阶,通常用m表示。从查找

3、效率考虑,一般要求m3。一棵m阶的B树或者是一棵空树,或者是满足下列要求的m叉树:(1)根结点或者为叶子,或者至少有两棵子树,至多有m棵子树。(2)除根结点外,所有非终端结点至少有ceil(m2)棵子树,至多有m棵子树。(3)所有叶子结点都在树的同一层上。(4)每个结点的结构为:(n,A0,K1,A1,K2,A2,Kn,An)其中,Ki(1in)为关键字,且KiKi+1(1in-1)。Ai(0in)为指向子树根结点的指针。且Ai所指子树所有结点中的关键字均小于Ki+1。An所指子树中所有结点的关键字均大于Kn。n为结点中关键字的个数,满足ceil(m2)-1nm-1。一般来说B树的结构如下所示

4、:2.算法设计先定义一颗空树,题目给出的数据是,然后不断地调用插入算法来插入数据,完成构建。查找时,调用SearchBTree()函数来查找关键字;插入时,调用InsertBTree()函数来插入关键字,若插入后结点中关键字个数不符合要求,需用split()函数来调整。3.ADT描述 ADT List 数据对象:D:ai|aiElemSet,i=1,2,3, ,n,n0 数据关系:R1=|ai-1,aiD,i=2, ,n 基本操作: CreatBTree(&T); 构建一颗B树T InsertBTree(T,K,q,i); 在B树T上结点*q的keyi和keyi+1之间插入关键字K Searc

5、hBTree(T,K); 在B树T上查找关键字K ADT List;4.功能模块分析 1、SearchBTree()函数:B树的查找过程:根据给定值查找结点和在结点的关键字中进行查找交叉进行。首先从根结点开始重复如下过程: 若比结点的第一个关键字小,则查找在该结点第一个指针指向的结点进行;若等于结点中某个关键字,则查找成功;若在两个关键字之间,则查找在它们之间的指针指向的结点进行;若比该结点所有关键字大,则查找在该结点最后一个指针指向的结点进行;若查找已经到达某个叶结点,则说明给定值对应的数据记录不存在,查找失败。 2、Insert()函数:将所给关键字插入到正确节点的正确位置。代入指向所给关

6、键字应该插入节点的指针、所给关键字、关键字应该插入的位置,然后再将该关键字插入到节点的正确位置上,节点关键字个数加1,返回指向该节点的指针q。3、InsertBTree()函数:插入的过程分两步完成:(1)利用前述的B-树的查找算法查找关键字的插入位置。若找到,则说明该关键字已经存在,直接返回。否则查找操作必失败于某个最低层的非终端结点上。(2)判断该结点是否还有空位置。即判断该结点的关键字总数是否满足n=m-1。若满足,则说明该结点还有空位置,直接把关键字k插入到该结点的合适位置上。若不满足,说明该结点己没有空位置,需要把结点分裂成两个。分裂的方法是:生成一新结点。把原结点上的关键字和k按升

7、序排序后,从中间位置把关键字(不包括中间位置的关键字)分成两部分。左部分所含关键字放在旧结点中,右部分所含关键字放在新结点中,中间位置的关键字连同新结点的存储位置插入到父结点中。如果父结点的关键字个数也超过(m-1),则要再分裂,再往上插。直至这个过程传到根结点为止。详细设计1.主要算法流程图SearchBTree()函数:Insert()函数:InsertBTree()函数:2.数据存储设计 B树是一种平衡的多路查找树,存储结构可定义为:3界面设计参考文献 1严蔚敏:数据结构(C语言版)M,清华大学出版社2011年版,第238页。2Thomas H.Cormen: 算法导论 第二版M,机械工

8、程出版社,第263页。心得体会这学期的课程设计我选了个最难的课题“B树与B+树及其操作”,正好也是老师没有讲过的,所以说自己在这个课题上废了很大劲,因为是没有学过的,所以自己就到处找相关资料来自学B树,有上网找相关课件,也有找别的书籍来学习B树的知识,大概用了四周的时间来学习,最后还是只弄懂了B树的相关知识,也许是自己能力有限吧,B树也只搞懂了概念,以及插入,查找这两个操作,删除的代码没有写出来,B+树压根就没看懂,所以也没有写代码,大部分时间全用在了B树上。虽然这个课题只完成了一部分,但是自己也尽力了,毕竟自己能力有限,老师没有讲过,全靠自学来的,所以自己也问心无愧了。 通过这学期的课程设计

9、我明白了自己还有很多要学习的东西,不是说只学懂了课本上的知识就行了,还有很多老师没有讲到的知识也需要自己去学习,学无止境,不能为了考试而学习,要为了求知而学习。教师评语计算机学院课程设计答辩记录表专业学院计算机学院专业软件工程姓名宁琳琳学号课程设计题目B树与B+树及其操作答辩日期答辩时间答辩提问及其回答记录附录B树与B+树及其操作源代码:#include stdio. 7typedef struct BTNode int keynum; struct BTNode *parent; int keym+1; struct BTNode *ptrm+1;BTNode,*BTree;typedef

10、struct BTNode *pt; int i; int tag;Result;在结点中查找关键字int SearchNode(BTree p,int k) int i=1; while(ikeynum) if(kkeyi) return i-1; else if(k=p-keyi) return -1; else i+; return i-1;在B树中查找关键字kResult SearchBTree(BTree t,int k)t为B树根节点 BTree p=t,q=NULL; int found=0; int i=0; Result result; while(p&!found) i=S

11、earchNode(p,k); if(i=-1) result.pt=p; result.i=i; result.tag=1; return result; while(p-ptri) p=p-ptri; i=SearchNode(p,k); if(i0&p-keyi=k) found=1; else q=p; p=p-ptri; if(found) result.pt=p; result.i=i; result.tag=1; else result.pt=q; result.i=i; result.tag=0; return result;将关键字插入节点BTree Insert(BTree

12、 q,int i,int x,BTree ap) insert the key X between the keyi and keyi+1 at the pointer node q int j; for(j=q-keynum;ji;j-) q-keyj+1=q-keyj; q-ptrj+1=q-ptrj; q-keyi+1=x; q-ptri+1=ap; if(ap) ap-parent=q; q-keynum+; return q;分裂节点BTree split(BTree q,int s,BTree ap) move keys+1.m,p-ptrs.m int the new point

13、er *ap int i,j; ap=(BTree)malloc(sizeof(BTNode); ap-ptr0=q-ptrs; for(i=s+1,j=1;ikeynum;i+,j+) ap-keyj=q-keyi; ap-ptrj=q-ptri; ap-keynum=q-keynum-s; ap-parent=q-parent; for(i=0;ikeynum-s;i+) if(ap-ptri) ap-ptri-parent=ap; q-keyq-keynum=0; q-keynum=s-1; return ap;建立新的节点BTree NewRoot(BTree T,BTree p,in

14、t x,BTree ap) T=(BTree)malloc(sizeof(BTNode); T-keynum=1; T-ptr0=p; T-ptr1=ap; T-key1=x; if(p) p-parent=T; if(ap) ap-parent=T; T-parent=NULL; return T;建立B-树 BTree InsertBTree(BTree T,int K,BTree q,int i) 在m阶B树T上结点*q的keyi与keyi+1之间插入关键字K。 若引起结点过大,则沿双亲链进行必要的结点分裂调整,使T仍是m阶B树。 BTree ap; int finished, need

15、NewRoot, s; int x; if(!q) T是空树(参数q初值为NULL) T=NewRoot(T,NULL,K,NULL); 生成仅含关键字K的根结点*T else x=K; ap=NULL; finished=needNewRoot=0; while(!needNewRoot&!finished) q=Insert(q,i,x,ap); 将x和ap分别插入到q-keyi+1和q-ptri+1 if(q-keynumkeys+1.m, q-ptrs.m和 q-recptrs+1.m移入新结点*ap s=(m+1)2; ap=split(q,s,ap); x=q-keys; q-ke

16、ys=0; if(q-parent) 在双亲结点*q中查找x的插入位置 q=q-parent; i=SearchNode(q, x); else needNewRoot=1; else while if(needNewRoot) 根结点已分裂为结点*q和*ap T=NewRoot(T,q,x,ap); 生成新根结点*T,q和ap为子树指针 return T; InsertBTree搜索指定节点int found(BTree t,int k) int i=1; BTree p=t; while(ikeynum) if(k=p-keyi) return i; else if(kkeyi) if(p

17、-ptri-1) p=p-ptri-1; i=found(p,k); return i; else return -1; else i+; if(p-ptri-1) p=p-ptri-1; i=found(p,k); return i; return -1;先序遍历输出void inorder(BTree t) int i; if(t!=NULL) printf( ); for(i=1;ikeynum;i+) printf(%d ,t-keyi); printf() ); for(i=0;ikeynum;i+) if(t-ptri) inorder(t-ptri); else i+; int

18、main() cout=endl; cout* *endl; cout* *endl; cout*插入页面*endl; cout* *endl; cout* *endl; cout=endl; printf(n); printf(n); printf(n); BTree root=NULL; Result result; int i,x,arrayn; char ch5; printf(输入关键字序列n); for(i=0;in;i+) printf(输入第%d个数据:n,i+1); scanf(%d,&arrayi); i=0; while(in) result=SearchBTree(ro

19、ot,arrayi);寻找关键字在B树中应该插入的位置 if(result.i=-1) i+; else printf(将第%d个关键字 %d 插入B-树中;n,i+1,arrayi); root=InsertBTree(root,arrayi,result.pt,result.i); 插入结点 i+; printf(插入后的B树如下:n); inorder(root); 先序遍历 printf(n); printf(n); printf(n); cout=endl; cout* *endl; cout* *endl; cout*查找页面*endl; cout* *endl; cout* *endl; cout=endl; printf(n); printf(n); do printf(请输入要查找的关键字:n); scanf(%d,&x); i=found(root,x); if(i!=-1) printf(%d在节点中的序号 %dn,x,i); if(i=-1) printf(不能查找到关键字n); printf(是否继续查询?“是”请输入:1 “否”请输入:0n); scanf(%s,ch); while (ch0=1);

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1