- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构课设电子版部分参考模版概要
目 录
1 需求分析 - 1 -
2 系统设计 - 2 -
2.1 数据结构设计 - 2 -
2.2 函数设计 - 2 -
2.3 关键流程 - 3 -
2.3.1 系统主流程 - 3 -
2.3.2 查找函数流程 - 4 -
2.3.3 插入函数流程 - 4 -
3 调试分析 - 8 -
4 测试及运行结果 - 9 -
参考文献 - 10 -
附 录 - 11 -
1 需求分析
2-3树不是一种二叉树,但他的形状满足以下性质:(1)一个节点包含一个或两个键值(2)每个内部节点有两个子节点(如果它有一个键值)或三个子节点(如果它有两个键值)(3)所有叶节点都在树结构的同一层,因此树的高度总是平衡的。
对于每个结点, 左子树中所有后继结点的值都小于第一个键的值, 而其中间子树中所有结点的值都大于或等于第一个键的值。如果结点有右子树的话( 相应地, 结点存储两个键值) , 那么其中间子树中所有后继结点的值都小于第二个键的值, 而其右子树中所有后继结点的值都大于或等于第二个键的值。同时,同一层的键值从左到右增大。
2-3树的查找方法与二分查找树相似,从根节点出发,如果在根节点找到查找值则查找成功返回,否则根据节点键的规则递归地查找下去,直到找到或返回失败。
在2-3树中插入新值时并不为其开辟一个新的叶子节点来存储,也就是说,2-3树不是向下生长的。插入算法首先找到一个合适的叶子节点来存放该值,使树的性质不被破坏。如果该叶子节点只包含一个值(每个节点都最多有两个值),则简单将该值放入叶子节点即可。如果叶子结点本身已经包含两个值了,则需要为前加入的叶子开辟新的空间。设节点L为插入节点,但是已经满了,也就是,这个节点因为包含了三个值,所以必须进行分裂,设新分裂出来的节点为L’,则L将存储这三个值中最小的那个值,而L’则存储这三个值中最大的那个。处于中间的值将得到提升,作为插入值晋升到父节点去。如果父节点只包含一个键值,该值直接放入节点即可,否则,同样的“分裂-晋升”过程将在该父节点进行,一直递归到根节点为止。2-3的插入实现中利用了一个函数split,它接收被插入节点的指针和插入的数据,并将指向L指针和被往上传的值通过引用传回来。当插入结点已满时便启用这个函数。
从2-3树删除一个节点,有三种可能情况需要考虑:最简单的情况是,如果删除的值存储在有两个键值的节点上,直接删除该值并不影响树的性质与结构。如果被删除的值所在的节点只有它一个键值,被删除后该节点将为空,因此通过向兄弟节点借一个记录,并修改父节点来解决。如果兄弟节点不够借,则需要合并相邻节点,并影响双亲,可能导致树的高度下降。如果被删除的值是树的内部节点,则将被删除记录用右边子树中的最小键值代替,然后再根据第一、二种情况将该值删除。第一种情况的实现相当简单,只需要考虑如果删除的是左键值,那么要把右键值移过来而已。被借的情况由不同的转动和合并子程序实现。2 系统设计
2.1 数据结构设计
typedef struct Tree23Node { //定义2-3树的节点类型 int datal; //有两个数据域,用来存放节点内数据 int datar;
Tree23 lchild, mchild, rchild; //三个指针域,分别指向左中右三个孩子} Tree23Node;
2.2 函数设计
本系统所设计的函数见表2.1。
表2.1 函数列表
函数名称 函数原型 功能描述 main void main(); 系统主程序 compare int compare(int x, Tree23 t); 比较输入数和节点中的大关系createNode Tree23 createNode(int key); 建立一个新节点newRoot void newRoot(Tree23 *root, int key, Tree23 midSub); 新建一棵isleaf bool isleaf(Tree23 root); 判断是否为叶子节点findNode Tree23 findNode(Tree23 root, int key); 寻找节点 put void put(Tree23 *root, int key, Tree23 q); 向未满的节点插入一个数split void split(Tree23 p, int *key, Tree23 *q); 对节点的插入操作del Tree23 del() 删除空节点的具体操作insert23 void insert23(Tree23 *root, int key) 建立2-3树的主要过程visit void visit(Tree23 T) 通过使用“()层与层inO
您可能关注的文档
最近下载
- 雅安编写老旧小区改造建设项目可行性研究报告.docx
- 暖通工程施工的方案.doc VIP
- 家校协同育人模式实践总结PPT模板(2025教师专用).pptx VIP
- 高处作业风险及隐患排查(安全检查)清单.pdf VIP
- 重难点拓展:有关数轴的三种探索问题-人教版新七年级《数学》暑假自学提升讲义(解析版).docx VIP
- 2021北京清华附中初一(上)期末数学.pdf VIP
- 风力发电工程项目的安全管理体系及安全管理要点.docx VIP
- 2023北京清华附中初一(上)期末数学(教师版).docx VIP
- 输电线路铁塔标准化设计110kV分册(第1~5章).docx VIP
- 2024年山西关铝集团有限公司人员招聘考试题库及答案解析.docx VIP
文档评论(0)