DS博客大做业--树

此次是作的目录树,想到这个能够和python的目录爬取结合起来用,就想着搞点好玩的,把网站的可见目录转化成树结构可视化python

1.树的存储结构说明

因为没有对目录进行文件夹和文件的区分,因此结构体内容仍是比较少的,h是树的高度,永远方便后面树的图形化
函数

2.树的函数说明

2.1 函数概览

2.2 函数设计思路

2.2.1 FindPoint函数


做者有话说:这个函数决定是使用队列来操做,由于目录名考虑到会重复,因此要把每个结果输出出来。将中序遍历和strcmp结合起来用达到查找目录的目的,每一次递归都会把当前目录名入队,方便后面输出的时候使用,而fromwho是用于判断当前节点是兄弟仍是孩子,方便将前一项的兄弟或者孩子置为空,查找到就会由用户选择是否要删除了,若是要删除就将他传入DeletePoint函数递归删除测试

2.2.2 StoreTree函数


做者有话说
step 1:函数参数
传入函数的参数有二。一是树,二是文件指针。
这里采用的是递归法遍历树,咱们将文件的开关放在主函数当中,再将文件指针传到函数中,保证文件开关的正常运行。
step 2:树的遍历
这个函数的功能是将创建的树图形化输出到文件中。根据逻辑关系,在这里咱们要选取先序遍历。多叉树的先序遍历和二叉树遍历的写法是一致的,
只须要将左右孩子分别改为孩子与兄弟便可。
step 3:初步调试
在结构体的设计当中,为了便于图形化加入变量h,在这里的含义是目录等级。为了验证以上两个步骤正常实现,先直接输出到文件当中查看效果。利用T->h来控制tab的输出,可以初步看出目录的分级效果。
固然若是在遍历上的选择出现错误,在这里也能提前发现。
step 4:输出格式
这个函数比较麻烦的地方就在于它的格式控制。
在设计前,先打样估计设计想要的效果,再根据效果图寻找格式与Tree->h的数学逻辑关系。为了呈阶梯状图形化,将奇数级目录控制为纵向输出,偶数级目录控制为横向输出。再经过repeat和mark进一步控制横竖tab量动画

2.2.3 InsertPoint函数


做者有话说:这是建树的核心函数,思路是这样的,先读取site中前面一个目录名,而后查找当前point的兄弟节点中是否有这个文件存在,若是有就令point等于这个节点,而后用front记录上一个节点,用frontFlag标记上一个节点是父母节点仍是兄弟节点继续循环,没有就建立一个节点初始化后插入,而后令point等于这个节点继续循环,直到字符串结束。在查找的使用利用strcmp的特性进行插入,就能够达到排序的目的。网站

2.2.4 Creat_RawData函数


做者有话说:原本想尝试用C语言来实现这个爬取网站的过程,可是想了想以为意义不大(实际上是不会),因此就用python的bs4库来实现,借用system函数调用系统命令执行py文件设计

2.2.5 DeletePoint函数


做者有话说:很简单的一个后序遍历删除节点。3d

2.2.6 CreatTree函数


做者有话说:一行一行地读取raw_data.txt中地文件,而后偷懒的利用InsertPoint函数将每一行的Tree中去指针

2.2.7 python脚本展现


做者有话说:原理仍是比较简单的,就是访问网址的源代码利用bs4提取出html中a标签的href元素,添加进list型的变量里面,而后再将这个网址传入函数当中,重复上述操做,实现简单递归爬取目录的一个过程,有些href元素比较刁钻,好比http://rasang.site/example,href里面只会有/example,这种状况我没有去考虑,因此也处理不了这种问题,毕竟此次做业的重心也不在这上面,只是稍微添加一点乐趣罢了调试

3.树结果演示

3.1 树生成展现


做者有话说

3.2 插入删除展现

进入界面后用户须要输入一个网址用来爬行目录,结果会保存为txt也会展现在界面上

爬取网址结束后须要用户根据上面的结果输入要查找的目录名字,若是找到了会询问用户是否要删除这个目录,删除后使用StoreTree函数就能够将结果更新保存到txt图形化结果中

4.碰到问题

我遇到的问题:

问题一:python的bs4库不会用?

解决办法:百度搜索样例本身学

问题二:插入的时候怎么知道上一个节点是父母节点仍是兄弟节点?

解决办法:宏定义fromdad和frombro,用来标记上一个节点是谁

问题三:在查找函数输出时输出异常?

以下:

解决办法:在这里进行入队操做的时候不能使用先序的结构,不然路径是不对的,使用中序就能够解决,由于兄弟节点是不能直接入队的,只有孩子节点能够入队,这样才是一条路径

07遇到的问题

问题一:在StoreTree遍历写法上的选择

解决办法:考虑到函数有关乎文件的开关,所以一开始想经过非递归的形式进行遍历,可是代码比较赘余。最后选取递归的方法,并将文件的开关置外。

问题二:多级目录出现格式错误

解决办法: 为了使函数更具弹性,即函数适用对象更普遍,要找到一个合适的数学逻辑关系进行格式控制。经过调试,而且增长条件判断语句控制格式。

5.小结

先来讲说缺点:一个是在处理文件的时候没办法把文件和文件夹分开,这就致使要看后缀名来判断是否是文件夹。还有一个就是老师在最后展现课上说的,最后将结果输出到文件里面的时候重复地写入文件影响效率,在课上听老师说能够保存到同一个string类型变量里面的时候我才恍然大悟,string类型很灵活,大小不受限制,只要把全部语句都加进去,把回车也加进去,就能够实现一次性写入,这点我是真的没有想到。

再来讲说好的地方:自我以为比较好的一个地方是设置了fromdad和frombro的宏定义,用来区分插入和删除时上一个节点的类型,方便将后继置为NULL。

6.小组成员分配说明

谢晓淞:

陈玲清:
参与内容:StoreTree函数的实现。
最终得分:

罗小川:
参与内容:DeletePoint函数的实现,展现PPT的制做。
最终得分:

霍淏华:
参与内容:将插入和查找的过程用动画演示出来,方便同窗理解。
最终得分:

鲁俊文:
参与内容:测试bug。理解代码
最终得分:

岳小钢:
参与内容:测试bug。理解代码
最终得分:

介绍小组成员、参与内容、贡献度、最后得分

7.展现大家讨论的照片

相关文章
相关标签/搜索