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

DS博客大作业--树

大作业博客要求 (10分)

1.树的存储结构说明

.树采用的是链式存储结构。
.这段代码中定义了两个结构体。第一个是自定义为Name类型的结构体,里面的成员有字符串str和类型为整型的判断变量flag(判断是目录名还是文件)。
第二个结构体自定义为BTNode类型,里面的成员有Name类型的data(用于存放树结点),还有两个结构体指针分别指向兄弟结点和孩子结点。

1.1头文件1TreeNode.h

(定义结构体)

1475633-20190512233422349-164206101.png

1.2.头文件2 TreeFunction.h

(声明函数,方便后续函数使用时的调用)

1475633-20190512233643344-1736061529.png

1.3.其他两个文件:tree.cpp、input.cpp里包含的内容都是对各种函数功能的实现

2.树的函数说明

主函数.main.cpp

1475633-20190515154218590-1009509345.png

定义变量,控制输出输入的内容等

函数1.BTree ReadFile()函数

1475633-20190515155240000-1020014072.png

.功能:读取file文件和创建树结点。 
.设计思路:定义一个字符串用来存从文件中读取出来的字符,同时调用另一个函数创建树结点,最后将BT返回主函数。

函数2. void CreateNode(BTree &BT, string name)

1475633-20190515162518381-2063712814.png
1475633-20190515162552927-2120808265.png

.功能:创建树结点。
.设计思路:对字符串一段一段判断,以\和\0作为停止的点,定义flag用于区分插入位置,定义judge用来判断是否找到插入位置,定义一个结构名pre,根据name[i]是不是文件对pre.flag进行赋值,然后再根据它是文件还是目录进行创建结点

函数3.void PrintTree(BTree BT, int k)

1475633-20190515165016642-713346282.png
1475633-20190515165047508-1715879302.png

.功能:输出树。
.设计思路:遍历树中所有结点,判断该结点是不是文件,若是文件,则以该树的兄弟树作为递归出口按照格式输出树,若不是,则以该树的孩子树作为递归出口按照格式输出树

函数4.void FindRoute(BTree &BT,int &flag,vector &s,string name)

1475633-20190515165214662-1874002790.png

.功能:查找路径。
.设计思路:用兄弟孩子树做递归出口。比较name与data.str的大小关系,若相等 ,说明找到该文件,然后在目录树中寻找路径,并把它按照格式输出。 

函数5.void DeleteNode(BTree &BT)

1475633-20190515165358626-275353395.png
1475633-20190515165445380-332522389.png
1475633-20190515165513470-1840983426.png

.功能:删除数据
.设计思路:以读取的方式打开文件,查找是否有需要删除的结点,若找不到,则输出找不到此目录,否则,用链式结构的方式删除所系结点,并写入文件,达到删除目录的目的。

函数6.void IncreaseNode(BTree &BT)

1475633-20190517202746106-1872279231.png
1475633-20190517202812350-578950444.png
1475633-20190517202842501-279812404.png
1475633-20190517202922710-1530738830.png

.功能:增加数据
.设计思路:定义一个Data,把需要增加的目录名赋给Data中的str,然后再与树中的str进行比较,若相等,则输出“已存在”,否则,调用Tool函数插入该结点。

函数7.void FileWrite(BTree BT,ofstream &write,vector &s)

1475633-20190517203148628-508152821.png

.功能:修改文件
.设计思路:判断树的孩子结点是否为空,不为空时,把字符串存在vector里,再递归调用该函数本身,用于有共同路径的数据输到文件 。

函数8.int Tool(Name pre, BTree &Head, BTree &T, int flag)

1475633-20190517203255223-1785617894.png
1475633-20190517203324335-6504394.png

.功能:有序地插入结点
.设计思路:判断该结点是文件还是目录,并比较str的大小 ,建立一个新结点,若为文件,把树T当作该结点的孩子 ,否则,把它当作该结点的兄弟。然后再根据已经查找所要插入的位置进行插入。 

3.树结果演示

3.1.生成目录树

根据file.txt中的文件路径,生成一颗对应的目录树,并把树结构保存在tree.txt中。目录树中,孩子节点从左到右按照字符串字典序排序。

1475633-20190517204802395-1298884777.png

3.2.查找目录

输入一个文件名,能在目录树查找其路径,并把查找路径按照格式输出。

1475633-20190517205118352-389231538.png

3.3.删除目录

输入一个删除目录,能把该节点及其所有分支都删除.更新tree.txt

1475633-20190517205251542-96593251.png

3.4.增加目录

输入一个新路径,若该路径不存在,能在树中插入一个新分支。并更新tree.txt

1475633-20190517205330114-889813188.png

4.碰到问题

  • Q1: 区分文件跟txt。
  • A1: 在结构体中增加一个变量。
  • Q2: 孩子结点排序混乱。
  • A2: 采用分段查找法,找到插入位置然后调用Tool函数插入结点,保证孩子结点有序。
  • Q3: 增加目录时,查找插入的位置。
  • A3: 用compear比较树中的str与Data中的str的大小,若都相等则该目录已存在,否找找到插入位置。

5.小结

.好的地方:结构体简洁明了,可读性好。功能比较完善。
函数都主要分装在一个文件里,归纳性强。
.需要改进的地方:暂无发现太大问题

6.小组成员分配说明

1475633-20190517204356092-1114567579.png

7.展示你们讨论的照片

1475633-20190517210152653-617265889.png
1475633-20190517210210955-368931673.png
1475633-20190517210226824-68883533.png
1475633-20190517210948105-819584031.png

1475633-20190517210255712-380192703.png
1475633-20190517210511089-111837786.png
1475633-20190517210558797-441316680.png

转载于:https://www.cnblogs.com/Gejkdj/p/10849485.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值