DS博客作业04--树大作业
1.树的存储结构说明
data:该结点内容
son:指向该结点的孩子结点
bro:指向该结点的兄弟结点
2.树的函数说明
头文件
函数1:CreatBTree
作用:按照孩子兄弟链建文档树
设计思路:
补充
函数2:DestroyBTree
作用:销毁树
函数3:PrintBTree
作用:更新tree文件
设计思路:
补充
函数4:SeekTag 和 EndTag
作用:寻找指点结点
设计思路:
补充
函数5:NewTag
作用:插入新标签
设计思路:
补充
函数6:DeleteTag
作用:删除指定标签
设计思路:
补充
函数7:FileRead 和 DataChange
作用:对文本进行预处理,FileRead函数是读取文件单行字符串合并为一个字符串,DataChange函数是
将文本转发为字符串数组
设计思路:
补充
主函数
3.树结果演示
- 建文档树:
原html文档:
建树tree文档:
运行界面:
-
查找元素:
-
删除标签:
-
插入标签:
4.碰到问题
- 问题一:最早思路上的问题。最早读题的时候,还以为应该用二叉树来实现,后来在建结构体时发现不对,文档树显然是一个”多叉树“的问题,应该采用孩子-兄弟存储的方式来处理该问题。
- 问题二:html文档处理的问题。对于html文档的处理是一个挺麻烦的问题,是否要采用单个字符单个字符的判断?在经过讨论之后,我们采用了蔡德鑫的方法,也就是对html文档进行预处理,将html中的字符串,切割成一段一段的
字符串,并用一个字符串数组来存储,之后的建树直接遍历该全局字符串数组即可获取需要的字符串。 - 问题三:建树的时候没有将纯文本与非纯文本进行区分来建立结点,导致叶子节点不明确。后来创建结点的时候进行一个判断(用string类的find函数),问题就解决了。
- 问题四:更新tree.txt文件的函数,我们最早的思路是只需要在最早的时候打开一次文件,之后一直传递文件指针就行了,无需多次开闭文件。但到最后,发现文件会出现重复写的问题。于是,我们认为应该先将原文件删除,于是去网上找了相关资料(remove函数)。但是这个问题,还是用在调用该函数后关闭再开启文件解决了......因为这样就已经可以轻松解决了。
- 问题五:写删除函数的时候没有考虑到,当待删除的结点拥有兄弟结点时,如果直接将该节点删除,会导致其兄弟结点与其父结点的连接断开。解决方法是,在传参数时多增加一个形参PreBT(传递父节点)
,这样,在删除结点前先判断是否存在兄弟节点,若有兄弟结点,则需将父节点与待删除结点的兄弟连接,再将该节点删除;否则,直接删除。如图:
5.小结
这次的大作业
好在:小组分工明确,思路清晰,并且函数递归写的好,并且熟练
不好:删除插入的功能不完善,有小bug,查找函数脱离预期,无法输出整条路径,有局限性
6.小组成员分配说明
范华:完成main函数和其他同学的函数与main函数之间的调试和修改
李谦:参与讨论、测试数据
林钟鹏:完成NewTag和DeleteTag函数
蔡德鑫:完成树的创建CreatBTree函数和PrintBTree函数还有文件的预处理
白海槟:完成SeekTa函数和博客园
古锦源:参与讨论、PPT编辑、测试数据
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?