标签:
本博文将通过C语言的树结构来构造一个简单的类文件系统结构,包含文件/文件夹的新建、复制、重命名、删除等基本功能,同时也支持文件系统结构的整体预览。
#include<stdio.h>
#include<stdlib.h>
/*
* 数据结构:树文件目录系统
* C语言实现
* 2015-9-13
*/
typedef struct TreeNode *PtrToNode;
typedef PtrToNode Tree;
/*
* 文件或文件夹节点结构体
*/
struct TreeNode {
char* Name; //存储目录或文件名称
Tree Parent; //上一级目录
Tree FirstChild; //第一个子目录或子文件
Tree NextSibling; //下一个弟兄目录或文件
};
/*
* 释放内存
*/
void MakeEmpty(Tree T)
{
if (T->FirstChild != NULL) {
Tree t = T->FirstChild->NextSibling;
MakeEmpty(T->FirstChild);
Tree tmp = NULL;
while (t != NULL) {
tmp = t;
t = t->NextSibling;
MakeEmpty(tmp);
}
}
free(T);
}
/*
* 删除文件或文件夹
*/
void Delete(Tree T)
{
Tree tmp = NULL;
if (T->Parent != NULL&&T->Parent->FirstChild != T) {
tmp = T->Parent->FirstChild;
while (tmp->NextSibling != T) {
tmp = tmp->NextSibling;
}
tmp->NextSibling = T->NextSibling;
MakeEmpty(T);
}
else if (T->Parent != NULL&&T->Parent->FirstChild == T) {
T->Parent->FirstChild = T->NextSibling;
MakeEmpty(T);
}
else {
MakeEmpty(T);
}
}
/*
* 获取根目录
*/
Tree GetRootDir(Tree T)
{
Tree tmp = T;
while (tmp->Parent != NULL) {
tmp = tmp->Parent;
}
return tmp;
}
/*
* 重命名文件或文件夹
*/
void Rename(Tree T,char* NewName)
{
T->Name = NewName;
}
/*
* 新建一个文件
*/
Tree NewFile(char *X)
{
Tree T = (Tree)malloc(sizeof(struct TreeNode));
T->Name = X;
T->FirstChild = T->NextSibling = T->Parent = NULL;
return T;
}
/*
* 添加某个文件或目录到指定目录中
*/
Tree Insert(Tree Des, Tree Src)
{
Src->Parent = Des;
if (Des->FirstChild == NULL) {
Des->FirstChild = Src;
}
else {
Tree Tmp = Des->FirstChild;
while (Tmp->NextSibling != NULL) {
Tmp = Tmp->NextSibling;
}
Tmp->NextSibling = Src;
}
return Des;
}
/*
* 返回节点的深度
*/
int GetDepth(Tree T) {
int count = 0;
Tree tmp = T;
Tree Root = GetRootDir(T);
while (tmp->Parent != NULL) {
count++;
tmp = tmp->Parent;
}
return count;
}
/*
* 复制文件,符号复制
*/
void Copy(Tree File, Tree Dir)
{
int flag = 1;
if (Dir->FirstChild != NULL) {
Tree tmp = Dir->FirstChild;
while (tmp != NULL) {
if (tmp->Name != File->Name) {
tmp = tmp->NextSibling;
}
else {
flag = 0;
printf("文件已经存在,无法复制!\n");
break;
}
}
}
if (flag == 1) {
Dir = Insert(Dir, File);
}
}
/*
* 前序遍历打印所有文件目录结构
*/
void PrintWithPreorder(Tree T)
{
if (T != NULL) {
int H = 0;
if ((H = GetDepth(T)) > 0) {
while (H > 0) {
printf("\t");
H--;
}
printf("%s\n", T->Name);
}
else {
printf("%s\n", T->Name);
}
Tree tmp = T;
Tree child = tmp->FirstChild;
while (child != NULL) {
PrintWithPreorder(child);
child = child->NextSibling;
}
}
else {
printf("NULL\n");
}
}
/*
* 测试程序
*/
int main()
{
Tree T = NULL;
T = NewFile("root");
Tree T1 = NULL;
Tree T2 = NULL;
Tree T3 = NULL;
Tree T4 = NULL;
Tree T5 = NULL;
Tree T6 = NULL;
Tree T7 = NULL;
Tree T8 = NULL;
T1 = NewFile("dir1");
T2 = NewFile("dir2");
T3 = NewFile("dir3");
T4 = NewFile("dir4");
T5 = NewFile("dir5");
T6 = NewFile("dir6");
T7 = NewFile("dir7");
T8 = NewFile("dir8");
T = Insert(T, T1);
T = Insert(T, T2);
T4 = Insert(T4, T6);
T6 = Insert(T6, T8);
T1 = Insert(T1, T3);
T1 = Insert(T1, T4);
T1 = Insert(T1, T5);
T2 = Insert(T2, T7);
printf("文件结构如下:\n");
PrintWithPreorder(T);
Delete(T4);
PrintWithPreorder(T);
return 0;
}
这是在学习树数据结构时拓展的一个小练习,整体思想是通过对文件系统进行树形构建,把每一个文件/文件夹看成一个节点,该节点拥有文件名、父节点、子节点、兄弟节点等属性,根据这些属性可以判断这个节点是否是文件夹以及距离根节点的深度,还有通过释放内存可以进行文件/文件夹的删除操作。在复制文件时,本代码中使用的是符号复制,即类似于C++中的引用,与原文件绑定在一起。本代码将持续更新。
标签:
原文地址:http://my.oschina.net/zzw922cn/blog/509560