c/c++完整代码编写:利用树型结构设计并实现一个简单的目录管理系统,该系统可以对所有目录进行管理,如目录的新建、删除、查询、目录名称修改、按某种顺序输出所有目录(树的遍历操作)、以树型结构输出所有目录等功能。
时间: 2024-05-10 21:17:02 浏览: 121
以下是一个基于C++的简单目录管理系统的实现,采用的是树形结构。
```c++
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Directory {
public:
Directory(string name) : name(name) {}
string getName() {
return name;
}
void setName(string name) {
this->name = name;
}
void addChild(Directory* child) {
children.push_back(child);
}
vector<Directory*> getChildren() {
return children;
}
private:
string name;
vector<Directory*> children;
};
class DirectoryTree {
public:
DirectoryTree() {
root = new Directory("root");
}
void addDirectory(string path) {
vector<string> dirs = parsePath(path);
Directory* current = root;
for (int i = 0; i < dirs.size(); i++) {
string name = dirs[i];
Directory* child = findChild(current, name);
if (child == NULL) {
child = new Directory(name);
current->addChild(child);
}
current = child;
}
}
bool deleteDirectory(string path) {
vector<string> dirs = parsePath(path);
Directory* current = root;
for (int i = 0; i < dirs.size() - 1; i++) {
string name = dirs[i];
Directory* child = findChild(current, name);
if (child == NULL) {
return false;
}
current = child;
}
string name = dirs[dirs.size() - 1];
Directory* child = findChild(current, name);
if (child == NULL) {
return false;
}
else {
deleteChild(current, child);
return true;
}
}
bool renameDirectory(string path, string newName) {
vector<string> dirs = parsePath(path);
Directory* current = root;
for (int i = 0; i < dirs.size(); i++) {
string name = dirs[i];
Directory* child = findChild(current, name);
if (child == NULL) {
return false;
}
current = child;
}
current->setName(newName);
return true;
}
void printDirectories() {
printDirectories(root, 0);
}
private:
Directory* root;
vector<string> parsePath(string path) {
vector<string> dirs;
int start = 0;
int end = path.find('/');
while (end != string::npos) {
string dir = path.substr(start, end - start);
dirs.push_back(dir);
start = end + 1;
end = path.find('/', start);
}
string dir = path.substr(start);
dirs.push_back(dir);
return dirs;
}
Directory* findChild(Directory* parent, string name) {
vector<Directory*> children = parent->getChildren();
for (int i = 0; i < children.size(); i++) {
if (children[i]->getName() == name) {
return children[i];
}
}
return NULL;
}
void deleteChild(Directory* parent, Directory* child) {
vector<Directory*> children = parent->getChildren();
for (int i = 0; i < children.size(); i++) {
if (children[i] == child) {
children.erase(children.begin() + i);
delete child;
break;
}
}
}
void printDirectories(Directory* current, int depth) {
for (int i = 0; i < depth; i++) {
cout << "\t";
}
cout << "+ " << current->getName() << endl;
vector<Directory*> children = current->getChildren();
for (int i = 0; i < children.size(); i++) {
printDirectories(children[i], depth + 1);
}
}
};
int main() {
DirectoryTree tree;
tree.addDirectory("root/dir1/dir11");
tree.addDirectory("root/dir1/dir12");
tree.addDirectory("root/dir2/dir21");
tree.addDirectory("root/dir2/dir22");
tree.addDirectory("root/dir3/dir31");
tree.printDirectories();
tree.deleteDirectory("root/dir2/dir21");
tree.printDirectories();
tree.renameDirectory("root/dir1/dir12", "newname");
tree.printDirectories();
return 0;
}
```
这个目录管理系统包括了以下功能:
- 新建目录:通过 `addDirectory()` 函数添加目录,可以创建多级目录。
- 删除目录:通过 `deleteDirectory()` 函数删除目录。
- 修改目录名称:通过 `renameDirectory()` 函数修改目录名称。
- 遍历输出目录:通过 `printDirectories()` 函数实现以树形结构输出所有目录。
在这个实现中,目录使用 `Directory` 类来表示,每个目录有一个名称和多个子目录。目录树使用 `DirectoryTree` 类来管理,根目录为 `root`。在添加目录时,我们使用 `parsePath()` 函数将路径解析为一个字符串向量,然后遍历该向量中的每个目录名称,查找是否已经存在该目录。如果不存在,则创建一个新的目录,并将其添加到父目录的子目录列表中。如果存在,则继续遍历。在删除目录时,我们也使用 `parsePath()` 函数解析路径,然后遍历该向量中的每个目录名称,查找是否存在该目录。如果存在,则删除该子目录。在修改目录名称时,我们同样使用 `parsePath()` 函数解析路径,然后查找该目录并将其名称修改为新名称。在遍历输出目录时,我们使用递归函数 `printDirectories()` 实现树形结构的输出。
这是一个简单的目录管理系统的实现,可以根据需要进行修改和扩展。
阅读全文