《数据结构课程设计文件目录结构的显示.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计文件目录结构的显示.docx(6页珍藏版)》请在三一办公上搜索。
1、数据结构课程设计文件目录结构的显示1. ch0202:文件目录结构的显示,在VC+6.0环境下测试通过 l 文件main.c:案例源程序; l 文件input.txt:案例测试输入数据文件; l 文件bad_input_cases.txt:案例容错测试输入数据文件; l 文件output.txt:案例测试输入input.txt的输出结果文件; 2源代码 #include #include #include using namespace std; string s = ; int startPos = 0; ofstream outfile; ifstream infile; /*构造Tree
2、类*/ class Tree string Name; /* 树的根结点名称 */ int Size; /* 树的大小,用于统计这棵树本身及其包含的所以子树大小的总和*/ Tree* FirstChild; /* 指向它的第一个孩子结点 */ Tree* NextSibling; /* 指向它的下一个兄弟结点 */ Tree* parent; /* 指向双亲结点 */ public: Tree(string Name = , int Size = 0);/* 构造函数 */ void parse; /* 根据输入数据来建立树形结构 */ void reSize; /* 重新统计树结点的大小 *
3、/ 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; FirstChild = NULL; NextSibling = NULL; parent = NULL; /* 析构函数,删除同
4、一根结点下的各个子结点,释放空间 */ 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; /* 如果当前的结点没有孩子结点,则它的Size值不变,即为输入时候的值 */ if(temp-FirstChild != 0) temp =
5、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; for(int i=1;is.length;i+) if(si=* | si=(
6、 | 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(!checkName(Name) coutinput er
7、ror!-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) /检查当前的父目录包含的子文件(或目录数)
8、是否大于10; coutinput error!-dictionary contains more than 10 levels.parent; if(temp-NextSibling != NULL) flagi+ = true; else flagi+ = false; /*兄弟结点之间有相同的缩进,子结点比父结点向右缩进8个空格*/ while(i-) if(flagi = true) outfile| ; else outfileoutPut; temp1 = temp1-NextSibling; /* 跳过字符串s中,第(*i)个之后多余的空格 */ void skipWhiteSp
9、ace(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;
10、/* 由于用户输入时候目录的大小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; /* 提取目录/文件的
11、大小,然后将string类型转换成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); skipWhiteS
12、pace(s,&i); size = getSize(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) br
13、eak; / /* 主测试文件main.cpp*/ / int main Tree* 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;