数据结构课程设计-文件目录结构的显示

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

相关文档
最新文档