1.树的存储结构说明

树节点结构体

data:文件名
brother:兄弟节点
child:孩子节点
type:节点的类型,0为文件,1为目录
h:节点所在的层次

2.树的函数说明

头文件

函数1:CreatRoute

作用:根据输入的路径在树中创建对应的路径

设计思路

先遍历遍路径,逐个判断路径中的文件或目录在树中所在的同一层次中是否已经存在,若已存在着继续判断下一个文件或目录,若不存在则记录此路径上一个文件或目录并在树中找到对应的节点(若在路径开始的位置则为树根节点),再根据剩下的路径在所找到的路径下创建新的路径

代码



ps:这个函数是建树的关键函数,也是我构思了最久的函数,用map容器来储存已经存在的节点,这样在处理路径中的在树中已经存在的节点时就可以快速略过去创建那部分新的路径

函数2:SeetTree

作用:寻找指定的节点,同时若传入的flag值为1则在树中将此节点及后续节点删去

设计思路

遍历树,寻找与指定的值相同的节点,再根据flag的值决定是否删去此节点

代码

函数3:CreatTree

作用:在树中的指定节点下创建新的路径

设计思路

先在指定的节点下寻找到第一个节点的位置并在此位置创建第一个节点(保证节点按字典序排列,且所有非目录节点都在目录节点之前),再用尾插法创建剩下的节点(因为路径中的下一个节点是上一个节点的孩子节点,因此可以用尾插法建链表的形式创建剩余的节点)

代码





ps:建树的主体函数,创建路径的关键就在于第一个节点的创建,创建时既要保证兄弟链中的节点按字典序排序又要保证所有非目录节点都在目录节点之前,方便之后的输出,创建完头节点之后剩余节点的创建就和链表的创建差不多,每一个节点都是上一个节点的孩子节点,可以用尾插法来创建

函数4:CreatNode

作用:创建节点

设计思路

很普通的创建节点,没什么好说的

代码

函数5:SeetRoute

作用:根据输入的文件名查找路径,并把路径保存到栈中

设计思路

和二叉树查找的思路差不多,但要注意的是栈中同一层次的节点只能有一个,防止查找时把兄弟链的路径也保存到栈中

代码



ps:由于找到节点返回时,所找到的节点的双亲节点会优先入栈,所以将入栈条件设置为入栈的节点层次要小于栈顶的节点层次既可以保证路径的正确性又可以防止将查找路径时将兄弟节点也一并保存到栈中

函数6:DeleteNode

作用:删除节点及其所有分支

设计思路

本质上就是删除树,基本的操作

代码

函数7:StortTree

作用:将树图形化并保存到tree.txt中

设计思路

遍历树,先输出兄弟链中的非目录节点,再处理目录节点,具体操作见代码

代码





ps:输出时会扫描一遍兄弟链中的目录节点的数量,用来保证输出格式的正确性,同时将扫描兄弟链的条件设置为记录数组记录的当层节点为0用来保证不会对同一条存在目录节点的兄弟链多次扫描导致出错,即使因当条兄弟链的目录节点数为0导致多次扫描也不会导致输出出错

主函数





3.树结果演示

输入

输出



查找路径

插入新路径





删除节点及其所有分支



4.碰到的问题

  • Q1:由于我是用map容器来记录树的节点是否存在的,只有当路径存在新节点时才会创建这条路径,而当输入一条由树中已经有的节点名称但层次不同的合法路径时这条路径无法创建
  • A1:用多个map容器,树的每一层次都分别用一个map容器来记录,判定节点是已否存在时只用当层的map容器来判断
  • Q2:删除节点时将节点的兄弟节点也一并删除了
  • A3:在寻找要删除的节点时将指向此节点的指针由更改为NULL改为指向要删除节点的兄弟节点,同时在调用函数删除节点前将要删除节点的兄弟节点指针指向改为NULL

5.小结

本次大作业仍有一些缺点,一是将输出结构写入文件时将文件作为函数形参和反复写入影响效率,其实可以将所有的输入都写入string类中,再一次性输出到文件中,二是针对路径的创建可能会有一些特殊的情况无法处理,这是我思路本身的问题,真的要修复的话需要更换一种思路,对整个建树的代码进行大改,所以我也只好一直保留着这个bug写完这次作业了。

6.小组成员分配说明

  • 康友煌:除查找路径以外的所有代码,博客园
  • 王粤翰:查找路径的实现,查找bug,博客园
  • 刘鲜:PPT,查找bug,理解代码
  • 苏楚雯:PPT,查找bug,理解代码
  • 张瑀鑫:PPT,查找bug,理解代码
  • 许馨予:PPT,查找bug,理解代码

7.展示你们讨论的照片

DS博客大作业--树的更多相关文章

  1. DS博客大作业--树(李天明组)

    DS博客大作业--树 大作业博客要求 (10分) 1.树的存储结构说明 .树采用的是链式存储结构. .这段代码中定义了两个结构体.第一个是自定义为Name类型的结构体,里面的成员有字符串str和类型为 ...

  2. DS博客大作业--树 (陈梓灿组)

    1.树的存储结构说明 定义的结构体中,name是用于存放文件名称,string类型是字符串类型,定义了child孩子结点和brother兄弟结点. 2.树的函数说明 1.main函数 main函数中主 ...

  3. DS博客作业——树

    DS博客作业--树 1.本周学习总结 1.思维导图 2.谈谈你对树结构的认识及学习体会. 在树这一章节,我们学习的是二叉树的算法. 树的构建:一种是直接给树的顺序存储结构的字符串,一种是通过先序遍历和 ...

  4. DS博客作业08--课程总结

    DS博客作业08--课程总结 1.当初你是如何做出选择计算机专业的决定的? 1.1 经过一年学习,你的看法改变了么,为什么? 1.2 你觉得计算机是你喜欢的领域吗,它是你擅长的领域吗? 为什么? 1. ...

  5. DS博客作业--07查找

    目录 DS博客作业--07查找 1.本周学习总结(0--2分) 1.思维导图 2.谈谈你对查找运算的认识及学习体会. 2.PTA实验作业(6分) 2.1.题目1:6-1 二叉搜索树的操作集 (30 分 ...

  6. DS博客作业05--查找

    这个作业属于哪个班级 数据结构--网络2011/2012 这个作业的地址 DS博客作业05--查找 这个作业的目标 学习查找的相关结构 姓名 黄静 目录 0.PTA得分截图 1.本周学习总结 1.1 ...

  7. DS博客作业03--树

    这个作业属于哪个班级 数据结构--网络2011/2012 这个作业的地址 DS博客作业03--树 这个作业的目标 学习树结构设计及运算操作 姓名 黄静 目录 0. PTA得分截图 1. 本周学习总结 ...

  8. DS博客作业04--图

    这个作业属于哪个班级 数据结构--网络2011/2012 这个作业的地址 DS博客作业04--图 这个作业的目标 学习图结构设计及相关算法 姓名 黄静 目录 0.PTA得分截图 1.本周学习总结 1. ...

  9. DS博客作业04--树大作业说明

    大作业题目说明 1.目录树 按照如下目录路径,设计一颗目录树保存.并能实现对目录树遍历.目录路径存在file.txt,格式如下: b.txt c\ ab\cd.txt a\bc.txt ab\d.tx ...

随机推荐

  1. springboot(十七)-使用Docker部署springboot项目

    Docker 技术发展为微服务落地提供了更加便利的环境,使用 Docker 部署 Spring Boot 其实非常简单,这篇文章我们就来简单学习下. 首先构建一个简单的 Spring Boot 项目, ...

  2. 转载Google TPU论文

    选自 Google Drive 作者:Norman P. Jouppi 等 痴笑@矽说 编译 该论文将正式发表于 ISCA 2017 从去年七月起,Google就号称了其面向深度学习的专用集成电路(A ...

  3. 防范DDoS攻击的15个方法

    0x01 背景 为了对抗 DDoS(分布式拒绝服务)攻击,你需要对攻击时发生了什么有一个清楚的理解..简单来讲,DDoS 攻击可以通过利用服务器上的漏洞,或者消耗服务器上的资源(例如 内存.硬盘等等) ...

  4. js中 base64 转二进制

    function base64toBlob(base64,type) { // 将base64转为Unicode规则编码 let bstr = atob(base64, type), n = bstr ...

  5. 锋利的jQuery读书随笔

    代码规范:var $variable = jQuery对象:var variable = DOM对象: jQuery对象无法使用DOM对象的任何方法,同样DOM对象也无法使用jQuery对象的任何方法 ...

  6. ShuffleNet系列学习笔记

    ShuffleNet是旷世提出的高效轻量化网络,是一款很值得一提的轻量化网络,其相关论文也是很有价值的. ShuffleNet V1 该网络提出于2017年,论文为<ShuffleNet: An ...

  7. Kay and Snowflake CodeForces - 686D (树的重心性质)

    After the piece of a devilish mirror hit the Kay's eye, he is no longer interested in the beauty of ...

  8. Java 基础知识点滴(1)

    1. ==与equals的区别 ==是用来判断两个变量的值是否相等.要比较两个基本变量或引用变量是否相等,只能用==: equal用来判断两个独立对象里面的内容是否一样. 例子: String s1 ...

  9. pikachu-file

    1.不安全的文件下载 1.1.概述 文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后 会开始执行下 ...

  10. 找到并更改启动时间(timeout)

    centos7更改引导项等待时间 centos7已经不用grub,改用grub2. [ root]# vi /boot/grub2/grub.cfg 找到并更改启动时间(timeout) [root] ...