用c++写一个关于利用树型结构设计并实现一个简单的目录管理系统,该系统可以对所有目录进行管理,如目录的新建、删除、查询、目录名称修改、按某种顺序输出所有目录(树的遍历操作)、以树型结构输出所有目录等功能。
时间: 2024-05-05 21:21:53 浏览: 94
好的,下面是一个简单的树型结构目录管理系统的C++实现代码:
```cpp
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct TreeNode{ //定义树节点
string name;
vector<TreeNode*> children; //子节点指针的向量
TreeNode(string s):name(s){} //构造函数
};
class DirectoryTree{ //目录树类
private:
TreeNode* root; //根节点指针
void clear(TreeNode* node){ //删除节点的递归函数
for(auto child:node->children){
clear(child); //递归删除子节点
}
delete node; //删除自身节点
}
void preOrder(TreeNode* node){ //前序遍历的递归函数
cout<<node->name<<" ";
for(auto child:node->children){
preOrder(child); //递归访问子节点
}
}
void postOrder(TreeNode* node){ //后序遍历的递归函数
for(auto child:node->children){
postOrder(child); //递归访问子节点
}
cout<<node->name<<" ";
}
public:
DirectoryTree():root(new TreeNode("root")){} //构造函数,初始化根节点
~DirectoryTree(){clear(root);} //析构函数,释放内存
void add(string path){ //添加目录的函数
TreeNode* node=root;
int pos=0;
while(pos<path.size()){
int next=path.find("/",pos+1); //查找下一个斜杠的位置
if(next==string::npos) next=path.size(); //如果找不到下一个斜杠,就到字符串末尾
string name=path.substr(pos+1,next-pos-1); //提取子目录名称
pos=next;
bool found=false;
for(auto child:node->children){
if(child->name==name){
node=child; //找到子目录,进入子目录
found=true;
break;
}
}
if(!found){ //未找到子目录,创建新节点并添加到父节点的children向量中
TreeNode* child=new TreeNode(name);
node->children.push_back(child);
node=child;
}
}
}
void remove(string path){ //删除目录的函数
TreeNode* node=root;
int pos=0;
while(pos<path.size()){
int next=path.find("/",pos+1); //查找下一个斜杠的位置
if(next==string::npos) next=path.size(); //如果找不到下一个斜杠,就到字符串末尾
string name=path.substr(pos+1,next-pos-1); //提取子目录名称
pos=next;
bool found=false;
for(auto child:node->children){
if(child->name==name){
node=child; //找到子目录,进入子目录
found=true;
break;
}
}
if(!found){ //未找到子目录,退出函数
return;
}
}
clear(node); //删除节点
auto& siblings=node->children; //获取父节点的children向量引用
siblings.erase(find(siblings.begin(),siblings.end(),node)); //从父节点的children向量中删除节点
}
void rename(string path,string name){ //修改目录名称的函数
TreeNode* node=root;
int pos=0;
while(pos<path.size()){
int next=path.find("/",pos+1); //查找下一个斜杠的位置
if(next==string::npos) next=path.size(); //如果找不到下一个斜杠,就到字符串末尾
string curr_name=path.substr(pos+1,next-pos-1); //提取子目录名称
pos=next;
bool found=false;
for(auto child:node->children){
if(child->name==curr_name){
node=child; //找到子目录,进入子目录
found=true;
break;
}
}
if(!found){ //未找到子目录,退出函数
return;
}
}
node->name=name; //修改节点名称
}
void preorder(){preOrder(root);} //前序遍历
void postorder(){postOrder(root);} //后序遍历
};
int main(){
DirectoryTree tree;
tree.add("/home/user1"); //添加目录
tree.add("/home/user2");
tree.add("/home/user1/documents");
tree.add("/home/user1/pictures");
tree.add("/home/user2/music");
tree.add("/home/user2/documents");
tree.add("/home/user2/pictures");
tree.preorder(); //前序遍历输出
cout<<endl;
tree.postorder(); //后序遍历输出
cout<<endl;
tree.remove("/home/user2/documents"); //删除目录
tree.rename("/home/user1/pictures","photos"); //修改目录名称
tree.preorder(); //前序遍历输出
cout<<endl;
tree.postorder(); //后序遍历输出
cout<<endl;
return 0;
}
```
该程序使用树型结构实现了一个简单的目录管理系统,可以对所有目录进行管理,如目录的新建、删除、查询、目录名称修改、按某种顺序输出所有目录(树的遍历操作)、以树型结构输出所有目录等功能。
阅读全文