C言語のファイルツリー構造
24421 ワード
1.紹介
本ブログは、C言語のツリー構造を通じて、ファイル/フォルダの新規作成、コピー、名前変更、削除などの基本機能を含む簡単なクラスファイルシステム構造を構築します.また、ファイルシステム構造の全体プレビューもサポートします.
2.コードの例
これはツリーデータ構造を学習する際に展開される小さな練習であり、全体の思想はファイルシステムをツリー構造することによって、各ファイル/フォルダをノードと見なし、ノードはファイル名、親ノード、サブノード、兄弟ノードなどの属性を持ち、これらの属性からこのノードがフォルダであるかどうかとルートノードの深さを判断することができる.メモリをリリースすることでファイル/フォルダの削除操作ができます.ファイルをコピーするときに、このコードで使用されるのは符号コピーです.つまり、C++の参照と同じように、元のファイルと紐付けられています.このコードは継続的に更新されます.
転載先:https://www.cnblogs.com/zzw922cn/p/4828352.html
本ブログは、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