博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DS博客大作业--树
阅读量:5064 次
发布时间:2019-06-12

本文共 2653 字,大约阅读时间需要 8 分钟。

目录

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

1.树的存储结构说明

由于没有对目录进行文件夹和文件的区分,所以结构体内容还是比较少的,h是树的高度,永远方便后面树的图形化

1474626-20190511170245218-1303957240.png

2.树的函数说明

2.1 函数概览

1474626-20190511170509466-171608870.png

2.2 函数设计思路

2.2.1 FindPoint函数

1474626-20190511171327975-454173605.png

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

2.2.2 StoreTree函数

1474626-20190511224701805-810428421.png

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

2.2.3 InsertPoint函数

1474626-20190511171513504-402169485.png

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

2.2.4 Creat_RawData函数

1474626-20190511171426303-653741019.png

作者有话说:本来想尝试用C语言来实现这个爬取网站的过程,但是想了想觉得意义不大(其实是不会),所以就用python的bs4库来实现,借用system函数调用系统命令执行py文件

2.2.5 DeletePoint函数

1474626-20190511171439433-4745559.png

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

2.2.6 CreatTree函数

1474626-20190511171531047-1189919643.png

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

2.2.7 python脚本展示

1474626-20190511173537723-757682465.png

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

3.树结果演示

3.1 树生成展示

1474626-20190511171711314-979460960.png

1474626-20190511204657128-521256008.png

作者有话说

3.2 插入删除展示

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

1474626-20190511172104594-66281574.png

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

1474626-20190511172305918-2028738685.png

4.碰到问题

我遇到的问题:

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

解决办法:百度搜索样例自己学

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

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

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

如下:

1474626-20190511201712234-1534070882.png
解决办法:在这里进行入队操作的时候不能使用先序的结构,否则路径是不对的,使用中序就可以解决,因为兄弟节点是不能直接入队的,只有孩子节点可以入队,这样才是一条路径

07遇到的问题

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

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

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

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

5.小结

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

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

6.小组成员分配说明

谢晓淞:

陈玲清:

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

罗小川:

参与内容:DeletePoint函数的实现,展示PPT的制作。
最终得分:

霍淏华:

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

鲁俊文:

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

岳小钢:

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

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

7.展示你们讨论的照片

1474626-20190522221001348-1169197028.jpg

转载于:https://www.cnblogs.com/Rasang/p/10849223.html

你可能感兴趣的文章
基于zuul 实现API 网关
查看>>
定义自己的布局RelativeLayout 绘制网格线
查看>>
redis
查看>>
Ubuntu13.04 安装 chrome
查看>>
WampServer phpadmin apache You don't have permission to access
查看>>
解决sonarQube 'Unknown': sonar.projectKey
查看>>
ASPX页面弹窗的方法---javascript
查看>>
JavaScript和快速响应的用户界面
查看>>
winform控件跨线程委托
查看>>
利用subst命令将一个文件夹镜像成本地的一个磁盘
查看>>
NO 1,人生苦短,我学python之python+selenium自动化环境搭建
查看>>
206-反转链表
查看>>
Mybaits 插入数据返回主键ID
查看>>
PHP流程控制(一)
查看>>
判断是32位还是64位的CPU,CPU型号
查看>>
day 32 管道 事件 信号量 进程池
查看>>
做过的项目
查看>>
ubuntu14.04 +nginx+php5-fpm
查看>>
(转)最大类间方差法(Otsu)
查看>>
常用jar包下载地址汇总
查看>>