数据结构课程设计-文件目录结构的显示
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.ch0202:文件目录结构的显示,在VC++6.0环境下测试通过
●文件main.c:案例源程序;
●文件input.txt:案例测试输入数据文件;
●文件bad_input_cases.txt:案例容错测试输入数据文件;
●文件output.txt:案例测试输入input.txt的输出结果文件;
2源代码
#include
#include
#include
using namespace std;
string s = "";
int startPos = 0;
ofstream outfile;
ifstream infile;
/**构造Tree类**/
class Tree{
string Name; /* 树的根结点名称*/
int Size; /* 树的大小,用于统计这棵树本身及其包含的所以子树大小的总和*/ Tree* FirstChild; /* 指向它的第一个孩子结点*/
Tree* NextSibling; /* 指向它的下一个兄弟结点*/
Tree* parent; /* 指向双亲结点*/
public:
Tree(string Name = "", int Size = 0);/* 构造函数*/
void parse(); /* 根据输入数据来建立树形结构*/
void reSize(); /* 重新统计树结点的大小*/
void outPut(); /* 输出树形结构*/
~Tree(); /* 析构函数*/
};
/*** 树结点数组treeArray[],以及用来标注双亲结点位置的head和目录结点的rear***/ Tree* treeArray[100];
int head = 0, rear = 0;
/*** 建立只有一个结点的树,其三个指针域均为空***/
Tree::Tree(string Name, int Size){
this->Name = Name;
this->Size = Size;
FirstChild = 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;
/*** 如果当前的结点没有孩子结点,则它的Size值不变,即为输入时候的值***/ if(temp->FirstChild != 0){
temp = temp->FirstChild;
while(temp != 0){
temp->reSize();
Size += temp->Size;
temp = temp->NextSibling;
}
}
}
/***检查Name中有无非法字符**************/
bool checkName(string s)
{
if(s[0]!='*' && s.length() > 10)
return false;
if(s[0]=='*' && s.length() > 11)
return false;
if(s[0]!='*' && (s[0]=='(' || s[0]==')' || s[0]=='[' || s[0]==']'))
return false;
for(int i=1;i if(s[i]=='*' || s[i]=='(' || s[i]==')' || s[i]=='[' || s[i]==']') return false; } return true; } /*** 按照先序遍历的方式有缩进地来输出树形结构***/ void Tree::outPut() { Tree* temp; /*用来指向当前结点的祖先结点*/ Tree* temp1; bool flag[11];/*用来标志输出缩进、层次情况的数组*/ int i; outfile.open("output.txt",ios::app); if(!outfile){ cout<<"cannot append the output file.\n"; exit(0); } if(!checkName(Name)){ cout<<"input error!--"< exit(0); } outfile<<"|_"< outfile.close(); /* 输出当前的结点信息*/ temp1= FirstChild;/* 用来指向当前结点的子结点*/ while(temp1 != NULL) { outfile.open("output.txt",ios::app); if(!outfile){ cout<<"cannot append the output file.\n"; exit(0); } i = 0; temp = temp1; while(temp->parent != NULL) { /*当前temp指针所指的结点如果有兄弟结点,则置flag数组值为1,否则置为0;并由此结点反复查询它的祖先结点的情况,直到根结点为止*/ if(i>=10){ //检查当前的父目录包含的子文件(或目录数)是否大于10; cout<<"input error!--dictionary contains more than 10 levels."< exit(0);