




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 数据结构课程设计 实验报告 学院: 专业: 班级: 姓名: 学号: 实验报告实验题目:二叉树应用文件目录结构显示2、 实验目的和要求: 给出Unix下目录和文件信息,要求编程实现将其排列成一定缩进的树。具体要求如下。 输入要求: 输入数据包含几个测试方案。每一个案例由几行组成,每一行都代表了目录树的层次结构。第一行代表目录的根节点。若是目录节点,那么它的孩子节点将在第二行中被列出,同时用一对圆括号“()”界定。同样,如果这些孩子节点钟某一个也是目录的话,那么这个目录所包含的内容将在随后的一行中列出,有一对圆括号将首位界定。目录的输入格式为:*name size,文件的输入格式为:name s
2、ize,其中*代表当前节点的目录,name代表文件或目录的名称,由一串长度不大于10的字符组成,并且name字符串中不能包含有(,),*。size是该文件/目录的大小,为大于0的整数。每一个案例中最多只能包含10层,每一层最多有10个文件/目录。 输出要求: 对每一个测试案例,输出时要求:第d层的文件/目录名前面需要插入8*d个空格,兄弟节点之间要在同一列上。不要使用Tab(制表符)来统一输出的缩进。每一个目录的大小(size)是它包含的所有子目录和文件大小以及它自身大小的总和。3、 实验过程:目录结构是一种典型的树形结构,为了方便对目录的查找、遍历等操作,可以选择孩子兄弟双亲链表来存储树的结
3、构。程序中要求对目录的大小进行重新计算,根据用户的输入来建立相应的孩子兄弟双亲链表,最后输出树形结构。可以引用一个Tree类,将树的构造、销毁、目录的大小重新计算(reSize)、建立树形链表结构(parse)、树形结构输出(outPut)等一系列操作都封装起来,同时对于每一个树的节点,它的私有变量除了名称(Name)、大小(Size)和层数(Depth)之外,根据孩子兄弟双亲链表表示的需要,还要设置三个指针,即父指针(Tree*parent)、下一个兄弟指针(Tree*NextSibling)和第一个孩子指针(Tree*FirstChild)。 1.建立树形链表结构的函数parse() 根据
4、输入来确定树形关系时,首先读取根节点目录/文件名和大小值,并根据这些信息建立一个新的节点;然后读入后面各行信息,对于同一括号中的内容,即具有相同父节点的那些节点建立兄弟关联。这个函数实际上是采取遍历建立树形链表结构。 定义一个Tree*类型的数组treeArray,用来存放目录的节点信息,并定义两个整型变量head和rear,head值用来标记当前节点的父节点位置,每处理完一对括号,head需要增加1,即下一对待处理括号的父节点在treeArray中要往后移一个位置。如果当前处理的节点是目录类型,则将它放在treeArray数组中,rear是treeArray的下标变量,加入一个目录节点信息,
5、rear就增加1;如果是文件类型的目录,则需要按照Name和Size建立一个树的节点,并和head所指的父节点建立关联,但是不用放入treeArray中。 为进一步说明这个树形链表结构的构成,可参考下图。它是根据如下的具体输入例子所形成的结构示意。 输入: */usr1 (*mark 1 *alex 1) (hw.c3 *course 1)(hw.c 5) (aa.txt 12) 2.目录大小重新计算函数reSize() 输入数据中对目录大小的初始值一般为1,而目录的真正大小应该是自身的大小和它包含的所有文件及子目录的大小之和。因此,在计算目录大小的时候,需要遍历它下面所有的文件和子目录,可以
6、采用递归嵌套的后序遍历方式。另外要注意,采用孩子兄弟双亲链表表示时,父目录下的所有子目录和子文件都在该父目录的左子树上(右子树第一个节点是该目录的兄弟节点),所以白努力的时候只需要遍历目录对的左子树即可。3.输出树形结构的函数outPut() 输出是一个先序遍历的过程。为完成对树形的输出,兄弟目录之间需要相同的缩进,用|上下相连,而父子目录或父目录和子文件之间需要设定正确的缩进,子目录或子文件要比父目录向右缩进8个空格。设置一个标志数组flag11(每个目录下最大的层次数为10),当前Tree*temp指针所指的节点如果有兄弟节点,则置flag数组值为1,否则置为0;并由此节点反复查询它的祖先
7、节点的情况,直到根节点为止。输出时,遇到flag=1时,屏幕输出“| ”,表明是兄弟节点;遇到flag=0则输出“ ”, 有相同的缩进,而子节点总比父节点向右缩进8个空格。 4.消除输入中多余空格的函数skipWhiteSpace(string &s,int *i) 从用户输入数据中读入一行后,调用该函数来跳过s字符串中si之后的空格,以方便后面的处理。 此外,关于读入目录名称、大小,以及将string类型的Size值转换成int类型的函数的实现,相对比较简单,此处不再赘述。利用VC+ 6.0将以下代码输入#include #include #include using namespace s
8、td;string s = ;int startPos = 0;ofstream outfile;ifstream infile;/*构造Tree类*/class Treestring Name; /* 树的根结点名称 */int Size; /* 树的大小,用于统计这棵树本身及其包含的所以子树大小的总和*/Tree* FirstChild; /* 指向它的第一个孩子结点 */Tree* NextSibling; /* 指向它的下一个兄弟结点 */Tree* parent; /* 指向双亲结点 */public:Tree(string Name = , int Size = 0);/* 构造函
9、数 */void parse(); /* 根据输入数据来建立树形结构 */void reSize(); /* 重新统计树结点的大小 */void outPut();/* 输出树形结构 */Tree(); /* 析构函数 */;/* 树结点数组treeArray,以及用来标注双亲结点位置的head和目录结点的rear*/Tree* treeArray100;int head = 0, rear = 0;/* 建立只有一个结点的树,其三个指针域均为空 */Tree:Tree(string Name, int Size)this-Name = Name;this-Size = Size;FirstC
10、hild = NULL;NextSibling = NULL;parent = NULL;/* 析构函数,删除同一根结点下的各个子结点,释放空间 */Tree:Tree()Tree* temp;Tree* temp1;temp = FirstChild;while(temp != NULL)temp1 = temp;temp = temp-NextSibling;delete temp1;/* 先序遍历根结点下的所有结点,将每一个结点的Size值都加到根结点的Size中去*/void Tree:reSize()Tree* temp = this; /* 如果当前的结点没有孩子结点,则它的Siz
11、e值不变,即为输入时候的值 */if(temp-FirstChild != 0)temp = temp-FirstChild;while(temp != 0)temp-reSize();Size += temp-Size;temp = temp-NextSibling;/*检查Name中有无非法字符*/bool checkName(string s)if(s0!=* & s.length() 10)return false;if(s0=* & s.length() 11)return false;if(s0!=* & (s0=( | s0=) | s0= | s0=)return false;
12、for(int i=1;is.length();i+)if(si=* | si=( | si=) | si= | si=)return false;return true;/* 按照先序遍历的方式有缩进地来输出树形结构 */void Tree:outPut()Tree* temp; /*用来指向当前结点的祖先结点*/Tree* temp1;bool flag11;/*用来标志输出缩进、层次情况的数组*/int i;outfile.open(output.txt,ios:app);if(!outfile)coutcannot append the output file.n;exit(0);if
13、(!checkName(Name)coutinput error!-Nameendl;exit(0);outfile|_NameSizen;outfile.close(); /* 输出当前的结点信息 */temp1= FirstChild;/* 用来指向当前结点的子结点 */while(temp1 != NULL)outfile.open(output.txt,ios:app);if(!outfile)coutparent != NULL)/*当前temp指针所指的结点如果有兄弟结点,则置flag数组值为1,否则置为0;并由此结点反复查询它的祖先结点的情况,直到根结点为止*/if(i=10)/
14、检查当前的父目录包含的子文件(或目录数)是否大于10;coutinput error!-dictionary contains more than 10 levels.parent; if(temp-NextSibling != NULL)flagi+ = true; elseflagi+ = false;/*兄弟结点之间有相同的缩进,子结点比父结点向右缩进8个空格*/while(i-)if(flagi = true)outfile| ;elseoutfileoutPut();temp1 = temp1-NextSibling;/* 跳过字符串s中,第(*i)个之后多余的空格 */void s
15、kipWhiteSpace(string& s, int* i)while(s*i = t | s*i = )(*i)+;/* 获取输入行中一对()之间的字符串,即为同一双亲结点下的子结点 */string getSubDir(string& line, int* startPos)string res = ;skipWhiteSpace(line,startPos);while(line*startPos != )res += line(*startPos)+;res += line(*startPos)+;skipWhiteSpace(line, startPos);return res;
16、/* 由于用户输入时候目录的大小Size值为String类型,因此需要将它转变成integer类型*/int stringToNum(string s)int num = 0;unsigned int i = 0;while(i s.length()num *= 10;num += si+ - 0;return num;/* 提取目录/文件的名称 */string getName(string& s, int* i)string name = ;while(s*i != & s*i != t)name += s(*i)+;return name;/* 提取目录/文件的大小,然后将string类
17、型转换成integer类型 */int getSize(string&s, int* i)string size = ;while(unsigned int)(*i) FirstChild = new Tree(name,size);temp-parent = treeArrayhead%100;if(name0 = *)treeArray(rear+)%100 = temp;skipWhiteSpace(s,&i);while(si != )skipWhiteSpace(s,&i);name = getName(s,&i);skipWhiteSpace(s,&i);size = getSiz
18、e(s,&i);temp-NextSibling = new Tree(name,size);skipWhiteSpace(s,&i);temp = temp-NextSibling;temp-parent = treeArrayhead%100;if(name0 = *)treeArray(rear+)%100 = temp;head +; /*测试是否一行扫描完毕*/if(unsigned int)startPos = line.length()break; /*只有一个根结点的情况*/if(head = rear)break;/* 主测试文件main.cpp*/int main()Tre
19、e* fileTree;string s;string name;int size;outfile.open(output.txt);if(!outfile)coutcannot open the output file!n;exit(0);outfileThe result is as follows:n;outfile.close();infile.open(input.txt,ios:out);if(!infile)coutparse();fileTree-reSize();fileTree-outPut();delete fileTree;infile.close();return 0;4、 实验结果: 为了测试程序的正确性,需要分别测试它在正常情况和异常情况下的表现情况。 正常情况下的输入数据要求是:目录的初始大小一般设为1,目录名中不能包含(,),和*这些字符,加入多余的空格不影响最后的输出结果;同一父目录下的兄弟节点用一对圆括号括起来;同一层上的不同父节点下的子节点均列在同一行中,但按照父节点的不同永圆括号加以界定。 测试输入 */usr 1 (*mark 1 *alex 1) (hw.c 3 *course 1) (hw.c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 运用创新思维初级社会工作者考试试题及答案
- 2025餐饮兼职合同样本
- 医学常识面试题及答案
- 2025物业维修合同模板
- 猴痘相关知识试题及答案
- 2025年解除房屋租赁合同协议书格式
- 长沙语文面试题目及答案
- 社会工作者价值观考察试题及答案
- 如何下载租房合同协议书
- 二建土建考试题库及答案
- 外研版(三起)小学英语三年级下册Unit 1 Animal friends Get ready start up 课件
- 导数中的同构问题【八大题型】解析版-2025年新高考数学一轮复习
- 2024年中国海鲜水饺市场调查研究报告
- 肠内外营养护理要点
- 2019版人教版新课标高中英语选择性必修1词汇表带音标单词表+带音标汉译英默写+无音
- 机械设备故障应急预案与处理措施
- 一个人与公司合伙协议书范文
- 中国生殖支原体感染诊疗专家共识(2024年版)解读课件
- 气压传动课件 项目五任务三 压印设备气动系统的组装与调试
- 2024年法律职业资格考试(试卷一)客观题试卷与参考答案
- 户外空调外机清洗的安全协议书
评论
0/150
提交评论