用c语言写一个关于利用树型结构设计并实现一个简单的目录管理系统,该系统可以对所有目录进行管理,如目录的新建、删除、查询、目录名称修改、按某种顺序输出所有目录(树的遍历操作)、以树型结构输出所有目录等功能。
时间: 2024-05-04 15:19:05 浏览: 187
能够实现目录的树形结构
以下是一个示例代码,实现了一个简单的目录管理系统:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 50
// 定义目录节点结构体
typedef struct DirNode {
char name[MAX_NAME_LEN];
struct DirNode *parent;
struct DirNode *child;
struct DirNode *sibling;
} DirNode;
// 创建新的目录节点
DirNode *new_dir_node(char *name, DirNode *parent) {
DirNode *node = (DirNode*)malloc(sizeof(DirNode));
strncpy(node->name, name, MAX_NAME_LEN);
node->parent = parent;
node->child = NULL;
node->sibling = NULL;
return node;
}
// 在当前节点下创建子目录
DirNode *create_subdir(DirNode *parent) {
char name[MAX_NAME_LEN];
printf("请输入新目录的名称:");
scanf("%s", name);
DirNode *node = new_dir_node(name, parent);
if (parent->child == NULL) {
parent->child = node;
} else {
DirNode *sibling = parent->child;
while (sibling->sibling != NULL) {
sibling = sibling->sibling;
}
sibling->sibling = node;
}
printf("目录创建成功!\n");
return node;
}
// 删除指定节点及其所有子节点
void delete_dir(DirNode *node) {
if (node->child != NULL) {
delete_dir(node->child);
}
if (node->sibling != NULL) {
delete_dir(node->sibling);
}
if (node->parent != NULL && node->parent->child == node) {
node->parent->child = node->sibling;
}
free(node);
}
// 修改指定节点的名称
void rename_dir(DirNode *node) {
char name[MAX_NAME_LEN];
printf("请输入新的名称:");
scanf("%s", name);
strncpy(node->name, name, MAX_NAME_LEN);
printf("修改成功!\n");
}
// 按照前序遍历顺序输出所有节点名称
void print_dir_preorder(DirNode *node, int depth) {
for (int i = 0; i < depth; i++) {
printf(" ");
}
printf("- %s\n", node->name);
if (node->child != NULL) {
print_dir_preorder(node->child, depth+1);
}
if (node->sibling != NULL) {
print_dir_preorder(node->sibling, depth);
}
}
// 按照树形结构输出所有节点名称
void print_dir_tree(DirNode *node, int depth) {
for (int i = 0; i < depth; i++) {
printf(" ");
}
printf("- %s\n", node->name);
if (node->child != NULL) {
print_dir_tree(node->child, depth+1);
}
if (node->sibling != NULL) {
print_dir_tree(node->sibling, depth);
}
}
int main() {
DirNode *root = new_dir_node("root", NULL);
DirNode *current = root;
int choice = 0;
while (choice != 6) {
printf("\n当前目录:%s\n", current->name);
printf("1. 新建子目录\n");
printf("2. 删除当前目录\n");
printf("3. 修改当前目录名称\n");
printf("4. 切换当前目录\n");
printf("5. 输出所有目录\n");
printf("6. 退出\n");
printf("请选择:");
scanf("%d", &choice);
switch (choice) {
case 1:
current = create_subdir(current);
break;
case 2:
delete_dir(current);
current = root;
printf("目录删除成功!\n");
break;
case 3:
rename_dir(current);
break;
case 4: {
char name[MAX_NAME_LEN];
printf("请输入目录名称:");
scanf("%s", name);
DirNode *child = current->child;
while (child != NULL) {
if (strcmp(child->name, name) == 0) {
current = child;
break;
}
child = child->sibling;
}
if (child == NULL) {
printf("未找到指定目录!\n");
}
break;
}
case 5:
printf("\n前序遍历输出:\n");
print_dir_preorder(root, 0);
printf("\n树形输出:\n");
print_dir_tree(root, 0);
break;
case 6:
printf("谢谢使用!\n");
break;
default:
printf("无效选项!\n");
break;
}
}
return 0;
}
```
这个代码实现了一个简单的目录管理系统,支持创建子目录、删除目录、修改目录名称、切换当前目录、输出所有目录等功能。它使用了树型结构来表示目录结构,每个目录节点可以有一个父节点、一个子节点和多个兄弟节点。在输出所有目录时,它实现了前序遍历和树形输出两种方式。
阅读全文