C言語のファイルツリー構造

24421 ワード

1.紹介
本ブログは、C言語のツリー構造を通じて、ファイル/フォルダの新規作成、コピー、名前変更、削除などの基本機能を含む簡単なクラスファイルシステム構造を構築します.また、ファイルシステム構造の全体プレビューもサポートします.
2.コードの例
  1 #include
  2 #include
  3 /*
  4 *     :       
  5 * C    
  6 * 2015-9-13
  7 */
  8 typedef struct TreeNode *PtrToNode;
  9 typedef PtrToNode Tree;
 10 
 11 /*
 12 *            
 13 */
 14 struct TreeNode {
 15     char* Name; //         
 16     Tree Parent; //     
 17     Tree FirstChild; //          
 18     Tree NextSibling; //          
 19 };
 20 
 21 /*
 22 *     
 23 */
 24 void MakeEmpty(Tree T)
 25 {
 26     if (T->FirstChild != NULL) {
 27         Tree t = T->FirstChild->NextSibling;
 28         MakeEmpty(T->FirstChild);
 29         Tree tmp = NULL;
 30         while (t != NULL) {
 31             tmp = t;
 32             t = t->NextSibling;
 33             MakeEmpty(tmp);
 34         }
 35     }
 36     free(T);
 37 }
 38 
 39 /*
 40 *         
 41 */
 42 void Delete(Tree T)
 43 {
 44     Tree tmp = NULL;
 45     if (T->Parent != NULL&&T->Parent->FirstChild != T) {
 46         tmp = T->Parent->FirstChild;
 47         while (tmp->NextSibling != T) {
 48             tmp = tmp->NextSibling;
 49         }
 50         tmp->NextSibling = T->NextSibling;
 51         MakeEmpty(T);
 52     }
 53     else if (T->Parent != NULL&&T->Parent->FirstChild == T) {
 54         T->Parent->FirstChild = T->NextSibling;
 55         MakeEmpty(T);
 56     }
 57     else {
 58         MakeEmpty(T);
 59     }
 60 }
 61 
 62 /*
 63 *      
 64 */
 65 Tree GetRootDir(Tree T)
 66 {
 67     Tree tmp = T;
 68     while (tmp->Parent != NULL) {
 69         tmp = tmp->Parent;
 70     }
 71     return tmp;
 72 }
 73 
 74 /*
 75 *          
 76 */
 77 void Rename(Tree T,char* NewName)
 78 {
 79     T->Name = NewName;
 80 }
 81 
 82 /*
 83 *       
 84 */
 85 Tree NewFile(char *X)
 86 {
 87     Tree T = (Tree)malloc(sizeof(struct TreeNode));
 88     T->Name = X;
 89     T->FirstChild = T->NextSibling = T->Parent = NULL;
 90     return T;
 91 }
 92 /*
 93 *                
 94 */
 95 Tree Insert(Tree Des, Tree Src)
 96 {
 97     Src->Parent = Des;
 98     if (Des->FirstChild == NULL) {
 99         Des->FirstChild = Src;
100     }
101     else {
102         Tree Tmp = Des->FirstChild;
103         while (Tmp->NextSibling != NULL) {
104             Tmp = Tmp->NextSibling;
105         }
106         Tmp->NextSibling = Src;
107     }
108     return Des;
109 }
110 
111 /*
112 *        
113 */
114 int GetDepth(Tree T) {
115     int count = 0;
116     Tree tmp = T;
117     Tree Root = GetRootDir(T);
118     while (tmp->Parent != NULL) {
119         count++;
120         tmp = tmp->Parent;
121     }
122     return count;
123 }
124 
125 /*
126 *     ,    
127 */
128 void Copy(Tree File, Tree Dir)
129 {
130     int flag = 1;
131     if (Dir->FirstChild != NULL) {
132         Tree tmp = Dir->FirstChild;
133         while (tmp != NULL) {
134             if (tmp->Name != File->Name) {
135                 tmp = tmp->NextSibling;
136             }
137             else {
138                 flag = 0;
139                 printf("      ,    !
"); 140 break; 141 } 142 } 143 } 144 if (flag == 1) { 145 Dir = Insert(Dir, File); 146 } 147 } 148 149 /* 150 * 151 */ 152 void PrintWithPreorder(Tree T) 153 { 154 if (T != NULL) { 155 int H = 0; 156 if ((H = GetDepth(T)) > 0) { 157 while (H > 0) { 158 printf("\t"); 159 H--; 160 } 161 printf("%s
", T->Name); 162 } 163 else { 164 printf("%s
", T->Name); 165 } 166 Tree tmp = T; 167 Tree child = tmp->FirstChild; 168 while (child != NULL) { 169 PrintWithPreorder(child); 170 child = child->NextSibling; 171 } 172 } 173 else { 174 printf("NULL
"); 175 } 176 } 177 178 /* 179 * 180 */ 181 int main() 182 { 183 Tree T = NULL; 184 T = NewFile("root"); 185 Tree T1 = NULL; 186 Tree T2 = NULL; 187 Tree T3 = NULL; 188 Tree T4 = NULL; 189 Tree T5 = NULL; 190 Tree T6 = NULL; 191 Tree T7 = NULL; 192 Tree T8 = NULL; 193 T1 = NewFile("dir1"); 194 T2 = NewFile("dir2"); 195 T3 = NewFile("dir3"); 196 T4 = NewFile("dir4"); 197 T5 = NewFile("dir5"); 198 T6 = NewFile("dir6"); 199 T7 = NewFile("dir7"); 200 T8 = NewFile("dir8"); 201 202 T = Insert(T, T1); 203 T = Insert(T, T2); 204 205 T4 = Insert(T4, T6); 206 T6 = Insert(T6, T8); 207 208 T1 = Insert(T1, T3); 209 T1 = Insert(T1, T4); 210 T1 = Insert(T1, T5); 211 T2 = Insert(T2, T7); 212 213 printf(" :
"); 214 PrintWithPreorder(T); 215 Delete(T4); 216 PrintWithPreorder(T); 217 return 0; 218 }
3.コード説明
これはツリーデータ構造を学習する際に展開される小さな練習であり、全体の思想はファイルシステムをツリー構造することによって、各ファイル/フォルダをノードと見なし、ノードはファイル名、親ノード、サブノード、兄弟ノードなどの属性を持ち、これらの属性からこのノードがフォルダであるかどうかとルートノードの深さを判断することができる.メモリをリリースすることでファイル/フォルダの削除操作ができます.ファイルをコピーするときに、このコードで使用されるのは符号コピーです.つまり、C++の参照と同じように、元のファイルと紐付けられています.このコードは継続的に更新されます.
 
転載先:https://www.cnblogs.com/zzw922cn/p/4828352.html