欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    东北大学数据结构B树算法的应用实验报告docxWord格式.docx

    • 资源ID:1467729       资源大小:403.32KB        全文页数:37页
    • 资源格式: DOCX        下载积分:1金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要1金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    东北大学数据结构B树算法的应用实验报告docxWord格式.docx

    1、即此时的B-树已经建立好了。2.2.3 搜索指定结点,新建文件B-树索引过程就是搜索指定关键字的过程,从根结点开始,向子树结点中的关键字查找,当查找时即返回此时文件指针fp当前位置,假如查找失败,就继续查找,直到找到根结点为止,倘若还没查找到就返回没有找到。我们需要把学生的相关信息从键盘输入到指定文件中,其中包括学生的姓名,学号和家庭地址等信息,在利用文件中的fseek函数,使文件指针指向学生的相应信息位置,定义为整型,与结点中学生信息在文件中的位置信息相对应,运行时只需要输入学生学号,屏幕上会显示相应的学生完整信息,此时索引过程完成。 3 详细设计3.1 主函数设计3.1.1 设计思想B-树

    2、算法的实现,首先应该建立一个m阶的B-树(在本算法中m设为5)。在建立B-树过程中,首先输入一个关键字学生学号序列(为方便起见本算法使用整数序列,关键字个数设定为10),将这个整数序列存入数组中,然后从空树开始,依次将关键字插入B-树中,建立一个m阶的B-树。(在输入学生信息的同时只是将学生学号作为关键字存入文件中)建树过程中,每插入一个关键字,首先应该判断出这个关键字在B-树中应该插入的位置,需要调用SearchBTree()和SearchNode()两个函数共同配合完成;然后调用InsertBTree()和Insert()函数进行插入,插入完成后,应该看该节点中关键字个数是否小于B-树的阶

    3、数m,当节点中插入的关键字个数不符合要求时,应该考虑节点分裂的情况(根节点和子树节点的情况都应该考虑到,如果有节点分裂的情况,应该进行节点分裂,可以建立一个split()函数来实现这个功能;如果需要建立新的根节点,需要建立一个NewRoot()函数来完成这个功能。B-树建立成功后,返回指向该B-树根节点的指针。该算法要求具有查找任一指定学生信息的功能,可以输入任意一个学生的学号,在B-树中查找该关键字,看该关键字是否存在在该B-树,如果存在,则返回该关键字对应的学生完整信息,否则查找不成功,则该学号所对应的关键字不在该B-树中,以上即完成B-树索引过程。3.1.2 主流程图图3-1 主函数流程

    4、图3.2函数设计在该算法中,设计了一个main()主函数和10个子函数,通过主函数调用子函数、子函数相互调用,完成设计要求的B-树的建立、在B-树中查找指定节点(该算法中查找具体的关键字位置)、B-树的遍历以及输出遍历序列等功能。3.2.1 函数在该算法中涉及到的各个函数的中文和英文名称分别为:主函数main()、节点查找函数SearchNode()、B-树查找函数SearchBTree()、节点插入函数Inset()、节点分裂函数split()、节点建立函数NewRoot()、B-树插入函数InsertBTree()、查找函数found()、中序遍历输出函数PrintBTree()、文件写函

    5、数savestud()、文件读取函数readstud()。3.2.2 函数调用关系图 图3-2 函数调用模块图3.2.1 函数调用关系说明主函数里面包含四个函数,即主函数中需调用四个函数分别为SearchBTree()、InsertBTree()、found()、PrintBTree();执行SearchBTree()函数时需调用SearchNode()函数;执行InsertBTree()函数时,需要调用SearchNode()、NewRoot()、Insert()以及split()函数;执行found()函数时,要用到递归调用found()函数;执行PrintBTree()函数时,也要用到递

    6、归调用PrintBTree()函数。3.3存储结构在该设计的算法中,定义B-树中节点类型、B-树类型以及查找结果类型如下:#define m 3 /B-树的阶,暂定为3typedef struct BTNode int keynum; /节点中关键字个数 struct BTNode *parent; /指向双亲节点 int keym+1; /关键字向量,0号单元未用 struct BTNode *ptrm+1; /子树指针向量BTNode,*BTree; /B-树节点和B-树的类型typedef struct BTNode *pt; /指向找到的节点 int i; /在节点中的关键字序号 in

    7、t tag; /1:查找成功,0:查找失败Result; /B-树的查找结果类型3.4函数流程图在这部分中,将每个函数分别用流程图表示出来,并且将每个函数的功能以及实现过程详细的表述出来,使得能够更加清晰、有条理体现出该算法。3.4.1 函数调用关系说明函数名:main()函数功能:输入关键字序列,调用B-树建立函数、查找函数、遍历输出函数实现过程:如图2.1.1所示,输入一个关键字序列,存储到数组中。对于数组中每个学号关键字,首先调用函数SearchBTree(),找出该关键字应该插入的位置,然后调用函数InsertBTree(),将关键字依次插入B-树中,插入完成后,返回指向B-树的根节点

    8、指针。然后按照要求输入要查找的学号关键字,调用found()函数进行查找,返回查找结果(可进行循环输入查找)。并将查找的学号所对应的学生完整信息输出在屏幕上。完成索引过程。 图3-3 主函数流程图3.4.2 节点查找函数SearchNode()功能:在节点中查找关键字,返回该关键字在节点中的位置 图3-4 SearchNode()函数流程图如图2.1.2(a)所示,SearchNode()函数代入的参数是指向关键字可能所在节点的指针p和关键字k,从该节点的第一个关键字找起,依次将要查找的关键字与节点中的关键字比较,返回结果是所给关键字应该在节点中的位置。3.4.3 B-树查找函数函数名称:Se

    9、archBTree()从B-树的根节点开始查找,查找所给关键字在该B-树中的节点位置以及在所在节点中的位置,该函数返回结果为Result类型,result.i表示关键字在节点中应该插入的位置,result.pt 表示关键字应该所在的节点,result.tag表示是否能够在B-树中查找到该关键字。 图 3-5 SearchBTree()函数流程图如图 2.1.2(b)所示,代入B-树的根节点指针和要查找的关键字,从根节点开始,对每个节点使用SearchNode()函数,查找所给关键字所在的节点以及在该节点中的位置,如果该关键字已经存在于B-树中,则返回关键字所在节点、以及所在序号以及查找到的标志

    10、;如果不存在,则返回应该插入的节点指针、在节点中的序号以及没有找到的标志。3.4.4 节点插入函数Insert()将所给关键字插入到正确节点的正确位置 图3-6 Insert()函数流程图如图2.1.2(c)所示,代入指向所给关键字应该插入节点的指针、所给关键字、关键字应该插入的位置,然后再将该关键字插入到节点的正确位置上,节点关键字个数加1,返回指向该节点的指针q。3.4.5 节点分裂函数split()当节点中关键字个数不符合要求时,进行节点分裂 图 3-7 split()函数流程图如图2.1.2(d)所示,该函数带入的参数是指向要产生分裂的节点的指针q、节点最小子树个数s以及空指针ap,首

    11、先给ap分配BTree类型的空间,然后再将q中序号大于s的关键字插入到ap节点中,同时纸箱子树的指针也插入到ap中,然后再分别计算q和ap中的关键字个数,对q和ap进行处理。最后返回ap指针。3.4.6 节点建立函数NewRoot()建立新的节点,并且返回指向该节点的指针。 图 3-8 NewRoot()函数流程图如图2.1.2(e)所示,该函数的代入参数是根节点T、指向子树的指针p和ap以及关键字x,创建这个新节点,需要将关键字插入到该节点序号1的位置上,0号和1号的子树指针分别指向空。如果p和ap不为空,则它们的父节点指向T节点。该函数最后返回的是指针T。3.4.7 B-树建立函数Inse

    12、rtBTree()从空树开始建立B-树,返回的是B-树的根指针。 图 3-9 InsertBTree()函数流程图如图2.1.2(f)所示,该函数代入参数是根节点T、要插入到的节点q、要插入的关键字可以及在节点中应该插入的位置序号i。该函数从根节点开始建立B-树,当根节点为空时,需要建立新的根节点并且插入关键字;如果根节点不为空,则直接插入即可,但是插入完成后,要考虑是否有节点分裂的情况产生,入伏哦需要进行节点分裂,则要调用split()函数分裂节点(根节点分裂以及子树节点分裂的情况都考虑到)重新进行分裂插入。函数最后返回指向B-树根节点的指针T。3.4.8 查找函数found() 图 3-1

    13、0 found()函数流程图查找指指定关键字,查找成功则返回在所在节点的序号,否则返回-1。如图2.1.2(g)所示,该函数代入参数是B-树根节点指针t以及关键字k,从根节点开始查找,如果查找到返回i值否则返回-1,在查找过程中低轨调用函数found()进行查找。3.4.9 文件随机读写输出函数fseek()将位置指针按需要移动到任意位置,实现随即读写功能。 图 3-11 fseek()函数流程图实现过程: 需要查找学生相关信息时,只需输入对应的学生学号,利用fseek()函数,将文件指针指到相应内存处,将所有该学生信息全部显示出来,完成索引过程。4 运行调试4.1 调试过程中遇到的问题及解决

    14、办法在调试程序的过程中,遇到的问题有多种,但是集中表现为语句错误、逻辑错误、参数未定义等方面。针对该算法中的这些问题,进行了具体分析,找到了正确的解决办法。4.1.1 语句错误问题:missing ; before ;括号匹配不正确分析:这种问题在编译时最容易体现出来,因为如果出现这种错误,系统会进行提示。产生这种问题的原因是输入代码时疏忽,或是代入参数的类型与定义类型布匹配。如:定义BTree类型的指针p,引用的是&p,则会出现、匹配有误,解决该问题,根据提示找到该符号的地方,进行改正即可。4.1.2 逻辑错误函数不能调用或赋值语句不能这种问题在执行程序时出现,表现为执行到一半会出错。通常这

    15、种问题是由于编写算法算判断语句不完善造成的,通常解决办法是单步调试,找到出错的地方,即算法执行停止的地方,修改错误的逻辑语句。4.2 运行结果该设计最终要求实现B-树算法,根据该算法设定的参数,输入事先指定好的学生信息,按先后顺序从键盘输入到文件中,此时B-树已经建立好了,索引时只需输入任意一个学生的学号,就可以得到该学生完整信息的运行结果:学生信息包括学生的姓名,学号,成绩等。例如:输入的是:Zhao 1 78Qian 2 56Sun 3 87Li 4 34Zhou 5 67Wu 6 64 Zheng 7 39Wang 8 79Feng 9 68Chen 10 86程序会自动以学号为关键字建

    16、立好B-树,请输入要查找的学生信息的学号:输入5;则输出:当输入0的时候停止索引,过程结束!4.3 结论分析在该算法中,实现了建立一个m阶的B-树,返回指向建好的B-树根节点的指针,并且能够查找指定的学号关键字,若查找成功,则返回该关键字所在学生的相关信息,否则查找不成。在调试程序的过程中,遇到了许多常识性的问题,通过不断的调试、改进,最终使程序能够运行,并且得到正确的运行结果。在这个过程中,能够不断地发现问题,并且自己独立的去解决多遇到的问题,这是课程设计过程中所不可缺少的精神。参考文献1 .数据结构(用面向对象方法与C+描述),殷人昆等,清华大学出版社。2 .算法与数据结构习题精解和实验指

    17、导,宁正元等,清华大学出版社。3 .数据结构课程实验 徐孝凯 编著 ,清华大学出版社。4 严蔚敏,吴伟民 . 数据结构(C语言版)M. 北京:清华大学出版社,2006.5 吕国英. 算法设计与分析M. 北京:6 徐宝文,李志 . C程序设计语言M. 北京:机械工业出版社,2004.7 夏克俭 . 数据结构+算法M. 北京:国防工业出版社,2001.8 李春葆,曾慧,张植民 . 数据结构程序设计题典M. 北京:清华大学出版社,2002.附 录(关键部分程序清单)/B-树算法的应用#include stdio.hmath.hmalloc.hstdlib.hfstream.h#define m 5#

    18、define n 10 int locationm+1;struct student int num; char name10; int score;stdn;int an,bn;/在结点中查找关键字int SearchNode(BTree p,int k) int i=1; while(ikeynum) if(kkeyi) return i-1; else if(k=p- return -1; else i+; /在B树中查找关键字kResult SearchBTree(BTree t,int k)/t为B树根节点 BTree p=t,q=NULL; int found=0; int i=0

    19、; Result result; while(p&!found) i=SearchNode(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&keyi=k) found=1; q=p; p=p- if(found) result.pt=p; result.i=i; result.tag=1; result.pt=q; result.tag=0; return result;/将关键字插入节点BTree Inse

    20、rt(BTree q,int i,int x,BTree ap,int l) / 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; location j+1=q- location j;ptrj+1=q-ptrj;keyi+1=x;ptri+1=ap; location i+1=l; if(ap) ap-parent=q;keynum+; return q;/分裂节点BTree split(BTree q,int s

    21、,BTree ap) /move keys+1.m,p-ptrs.m int the new pointer *ap int i,j; ap=(BTree)malloc(sizeof(BTNode);ptr0=q-ptrs; for(i=s+1,j=1;ii+,j+)keyj=q-keyi;ptrj=q- location j=q- location i;keynum=q-keynum-s;parent=q-parent; for(i=0;i+) if(ap-ptri) ap-ptri-parent=ap;keyq-keynum=0; location q-keynum=s-1; return

    22、 ap;/建立新的节点BTree NewRoot(BTree T,BTree p,int x,BTree ap,int z) T=(BTree)malloc(sizeof(BTNode); T-keynum=1;ptr0=p;ptr1=ap;key1=x; location 1=z; if(p) p-parent=T;parent=NULL; return T;/建立B-树 BTree InsertBTree(BTree T,int K,BTree q,int i,int l) / 在m阶B树T上结点*q的keyi与keyi+1之间插入关键字K。 / 若引起结点过大,则沿双亲链进行必要的结点分

    23、裂调整,使T仍是m阶B树。 BTree ap; int finished, needNewRoot, s; int x; if(!q) / T是空树(参数q初值为NULL) T=NewRoot(T,NULL,K,NULL,l); / 生成仅含关键字K的根结点*T else x=K; ap=NULL; finished=needNewRoot=0; while(!needNewRoot&finished) q=Insert(q,i,x,ap,l); / 将x和ap分别插入到q-keyi+1和q-ptri+1 if(q-keynumkeys+1.m, q-ptrs.m和 / q- location s+1.m移入新结点*ap s=(m+1)/2; ap=split(q,s,ap); x=q-keys; l=q- location s; q-locations=0;keys=0;parent) / 在双亲结点*q中查找x的插入位置 q=q- i=SearchNode(q, x); else needNewRoot=1; / else / while if(needNewRoot) / 根结点已分裂为


    注意事项

    本文(东北大学数据结构B树算法的应用实验报告docxWord格式.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开