1.树的存储结构

本组采用的树的存储结构为链式结构,选择如图所示的结构体
Name为结点的名称
LevelNum为孩子节点的个数
*Children[20]用来指向不同的孩子结点(类似于二叉树的结构体,且数组大小这里取20,不够可以再增加)

2.树的函数说明

1.void Creatstr(string *str,int &length) 读取并分割文件中的字符串

   strtok是字符串分割函数,作用是将ch字符串中的字符串分割,分割的规则是在ch碰到与split变量有关的符号,都会将其改成‘\0’例如  split  =  "<>"ch = <html>用strtok分割后ch就变成了html,注意split中若有空格,ch中的空格也会被改成'\0',而且不是碰到 <> 在一起时才会将其改成'\0',只要字符串中含有 < 或者 > 都会被其改成'/0'void Creatstr(string *str,int &length)利用这个函数strtok()对读取到的文件中的字符串进行分割并且存入一个字符串数组中比如 文件中的内容如下<html><head><title>Demo</title></head><body><div>A<p>B</p>C</div><span>D</span></body></html>利用Creatstr(string *str,int &length)进行处理后str字符串数组中str[0] = htmlstr[1] = headstr[2] = titlestr[3] = Demostr[4] = /title......依次类推
而length就是字符串数组str的大小

2.void CreatTree(string str,BTNode &T,int length) 建立多叉树

利用Creatstr()函数得到的字符串数组str[ ]以及其长度length进行建树,建树方法如下
建立两个类型为<BTNode*>的栈 s1,s2
for i=0 to length-1 //遍历str
{若str[i][0]!='/'   建立一个结点,结点的名称为str[i],进s1栈若str[i][0]=='/'  (在s1栈中找到与之匹配的元素,例如 /html 对应html (在下方有解释)){while (不匹配)  {  s1.top()进s2栈且s1.pop() }找到匹配元素后(经过while循环后匹配元素此时在s1.top())  { BTNode* T=s1.top()  s1.pop()  //用指针T存放栈顶元素然后让栈顶出栈T对应的结点的孩子结点个数即为栈s2的长度 即T->LevelNum=s2.size()将s2的元素依次出栈直到栈空,并且依次存放到T->Children[ ]中最后将T入s1栈}}
}然后这里是配对的操作 即代码中的1 2 3步骤str2=str[i]str2.erase(str2.begin())用str2保存str[i],再用erase函数去除'/'字符str2.begin()是指向str2字符串的第一个字符,str.erase(p)就是删去str中p对应的字符所以str2.erase(str2.begin())是将str2字符串中的第一个字符串删去例如 str2=/htmel,经过erase()函数处理后就变成了 html 然后再去找s1中配对的元素

3.int FindPositionCode(BTNode T,string name,int a,int flag,int &flag2)


该函数有5个参数BTNode *T为树,str name所查找元素的名称,int *a为数组的头地址,且a[ ]数组中的元素全部为-1int flag为孩子结点Children[ ]对应的下标,头节点没有对应下标就用 -1int &flag2为了判断所查找的元素是否存在,存在时返回0,不存在时返回1
该函数运行结果会把位置编码储存再数组a[ ]中
而位置编码由上面的树状图来解释
例如元素e的位置就为00,f的为01,g的为02,h的为10.....
但是经过该函数处理后的数组a[ ]中a[0]一定为-1,后面的元素也都会是-1
所以数组a有用的部分就是  for a[1] to a[i] (a[i]的下一个元素a[i+1]=-1)
例如e的位置编码为00,则数组a[10]将会是-1 0 0 -1 -1 -1 -1 -1 -1 -1f的位置编码为01,则数组a[10]将会是-1 0 1 -1 -1 -1 -1 -1 -1 -1

4.void FindPosition(BTNode T,int a) 按格式输出元素路径

该函数利用上面FindPositionCode()函数得到的数组a[ ],然后进行处理,最后按格式输出路径

5.void CreatFileTree(BTNode T,int i,FILE fp) 建立文档树并写入tree.txt文件中

用递归遍历树T,然后再按照格式输出文档树
(类似于线序遍历,看代码慢慢体会)

3.树结果演示






4.碰到问题

1.选择树的结构体上花费较多时间
2.建树算法为本小组自创的非递归算法,在设计过程中花费较多时间,最后参考算术表达式转化成中缀表达式的算法设计出来
3.在设计输出路径的功能中,采取先获取位置编码然后再进行输出处理的做法也是本小组自创,在设计过程中也花费较多时间
4.在调式上,因为传参时忘了加符号&,导致程序崩溃

5.小结

1.虽然采用了比较不同的结构体,但是采取该结构体后可能会造成空间上的浪费
2.采用该结构体在遍历时时间复杂度比较高,而且建树过程较为复杂
3.好处就是建树的模型比较清晰做法比较独特

6.小组成员分配说明

main()函数:刘羽 1.5分
Creatstr()函数:阮承南 1.5分
CreatTree()函数:唐洪俊 2分
FindPositionCode()函数:沈宇涛 2分
FindPositionCode()函数:沈宇涛
CreatFileTree()函数:蔡丰俊 2分
博客园:张明海 1分

转载于:https://www.cnblogs.com/syt666/p/10896350.html

DS博客作业04--树大作业相关推荐

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

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

  2. DS博客作业03--栈和队列

    DS博客作业03--栈和队列 1.本周学习总结(0--1分) 谈谈你对栈和队列结构的认识及学习体会. 这章有认真预习,但做题还要依靠书,记不住,可能还需要多加练习,在PTA上的题只做了栈的,队列的做得 ...

  3. Ubuntu18.04安装g2o,及问题解决_HyperZhu的博客-CSDN博客_ubuntu18.04安装g2o

    Ubuntu18.04安装g2o,及问题解决_HyperZhu的博客-CSDN博客_ubuntu18.04安装g2o sudo apt-get install cmake libeigen3-dev ...

  4. HTML期末作业课程设计大作业~环境保护学生网页设计作业源码(HTML+CSS)

    HTML期末大作业~基于HTML+CSS环境保护学生网页设计 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?HTML网页作业无从下手?网页要求的总数量太多?没有合适的模板?等等 ...

  5. ssm(springmvc4+spring4+mybatis3)整合实战-个人博客系统-整合各大框架

    ssm(springmvc4+spring4+mybatis3)整合实战-个人博客系统-整合各大框架 ssm框架整合开发实战,这一篇我将介绍如何实现各大框架的整合. 上一篇博客,我介绍了web.xml ...

  6. 程序员为什么一定要有一个属于自己的博客网站?10大理由告诉你

    原文地址:https://www.yundashi168.com/358.html 前不久,网易博客发布公告,宣布将从2018年11月30日00:00起正式停止网易博客的运营.届时将关闭服务器,用户将 ...

  7. DS博客大作业--树

    1.树的存储结构说明 树节点结构体 data:文件名 brother:兄弟节点 child:孩子节点 type:节点的类型,0为文件,1为目录 h:节点所在的层次 2.树的函数说明 头文件 函数1:C ...

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

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

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

    1.本周学习总结(0--2分) 1.1.思维导图 1.2谈谈你对查找运算的认识及学习体会. 2.PTA实验作业(6分) 本周要求挑3道题目写设计思路.调试过程.设计思路用伪代码描述.题目选做要求: 原 ...

最新文章

  1. 【Qt】Qt中QJsonObject类
  2. 编程行业里面的新行话
  3. 2-1为什么选择Pytorch
  4. html左右分隔可调整,CSS实现可拖拽分割面板
  5. c语言商品货架管理_武威树脂蔬菜货架厂家价格,生鲜市场货架报价_欧固隆货架...
  6. JUC本质解析+进程/线程
  7. 雷电模拟器多开cpu优化_哪个电脑手游模拟器好用 安卓手游模拟器测试对比排行榜...
  8. 026 模块3-random库的使用
  9. linux 7- - watch,free,mpstat,vmstat,iostat,pidstat,df,du
  10. UIView用户事件响应
  11. java计算机毕业设计美发门店管理系统源码+系统+数据库+lw文档
  12. 索尼电视android9,索尼电视系统更新通知:解决升级到安卓9.0版本后bug问题
  13. Kibana启动报错 server is not ready yet的解决方案
  14. 计算机内无法使用搜狗,电脑搜狗输入法不能用怎么办
  15. MacFamilyTree 8 for Mac(家谱族谱制作)
  16. openjudge 1.9.14 铺地毯
  17. vue项目中常用的优秀插件库
  18. Visitor パターン
  19. 做一件事如何突破「擅长」达到「精通」
  20. 一)中央空调变风量变水量整体群控节能系统(专利技术)

热门文章

  1. Gin 框架学习笔记(02)— 参数自动绑定到结构体
  2. 2022-2028年中国塑料人造革行业市场研究及前瞻分析报告
  3. cuda安装教cudnn安装显卡问题
  4. pytorch adam 源码 关于优化函数的调整 optimizer 调参 重点
  5. ERROR: epmd error for host 192: badarg (unknown POSIX error)
  6. 王道考研 计算机网络笔记 第四章:网络层
  7. CodeGen结构循环回路
  8. GPU上创建目标检测Pipeline管道
  9. python Django 管理站点1.3
  10. java线程触发_java线程