Napisałem coś takiego, ale mam problem bo nie wiem czy usuwanie jest dobrze zrobione. Bo generalnie usuwać usuwa, ale nie wiem czy w pamięci nie zostają jakieś śmieci.
<code=c#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
/Definiowanie nowego typu - drzewa folderów/
typedef struct nodeTreeFolder{
unsigned int key;
char *folderName, *fileName;
struct nodeTreeFolder *root, *down, *up;
} treeFolder;
treeFolder *addNewParentFolder(treeFolder *head, char *newFolder){
treeFolder *p = malloc(sizeof(struct nodeTreeFolder)), *q;
p->folderName = newFolder;
p->key = 1;
p->down = p->root = NULL;
if (head == NULL){
p->up = head;
return p;
}
else{
q = head;
while (q->down) q = q->down;
q->down = p;
p->up = q;
return head;
}
}
treeFolder *addNewSubFolder(treeFolder *head, treeFolder *parent, char *newFolder){
treeFolder *p = malloc(sizeof(struct nodeTreeFolder)), *q;
p->folderName = newFolder;
p->key = 1;
p->down = p->root = NULL;
if (parent->root == NULL){
parent->root = p;
p->up = parent;
}
else{
q = parent->root;
while (q->down) q = q->down;
q->down = p;
p->up = q;
}
return head;
}
treeFolder *addNewFile(treeFolder *head, treeFolder *parent, char *newFile){
treeFolder *p = malloc(sizeof(struct nodeTreeFolder)), *q;
p->fileName = newFile;
p->key = 0;
p->down = NULL;
if (parent->root == NULL){
parent->root = p;
p->up = parent;
}
else{
q = parent->root;
while (q->down) q = q->down;
q->down = p;
p->up = q;
}
return head;
}
treeFolder *findFolder(treeFolder *head, char *folder){
treeFolder *p, *q = NULL;
int cmp = 0;
if (head == NULL) return NULL;
else{
p = head;
do{
cmp = strcmp(p->folderName, folder);
if (cmp == 0) return p;
else{
q = findFolder(p->root, folder);
if (q != NULL) return q;
p = p->down;
}
} while (p && cmp);
return NULL;
}
}
void printTreeFolder(treeFolder *head, int depth){
if (head != NULL){
for (int i = 0; i < depth; i++)
putchar('\t');
if (head->key == 1){
printf("/%s\n", head->folderName);
printTreeFolder(head->root, depth + 1);
}
else printf("%s\n", head->fileName);
printTreeFolder(head->down, depth);
}
}
void moveContentFolder(treeFolder *from, treeFolder *to){
treeFolder *q;
if (from->root != NULL){
if (to->root == NULL){
to->root = from->root;
from->root->up = to;
}
else{
q = to->root;
while (q->down) q = q->down;
q->down = from->root;
from->root->up = q;
}
from->root = NULL;
}
}
treeFolder *removeFolder(treeFolder *head, treeFolder *folder){
treeFolder *p;
if (head == NULL) return NULL;
if (head == folder) printf("Nie mozesz usunac katalogu domowego!\n");
else{
p = folder;
if (folder->up->root == folder){
if (folder->down == NULL) folder->up->root = NULL;
else folder->up->root = folder->down;
}
else{
if (folder->down == NULL) folder->up->root = NULL;
else folder->up->root = folder->down;
}
free(p);
}
return head;
}
int main(){
int n;
treeFolder *T = NULL, *q;
char *parentFolderName, *subFolderName, *fileName, c;
T = addNewParentFolder(T, "home");
menu:
if (T){
printf("Twoje drzewo katalogow:\n");
printTreeFolder(T, 0);
}
parentFolderName = malloc(sizeof(char) * 256);
subFolderName = malloc(sizeof(char) * 256);
fileName = malloc(sizeof(char) * 256);
printf("\n1.Dodaj nowy folder podrzedny\n2.Dodaj nowy plik do folderu\n3.Usuwanie folderu\n0.Zakoncz prace programu.\n");
printf("Co wybierasz? "); scanf("%d", &n);
system("cls");
switch (n){
case 0:
return 0;
case 1:
printf("Podaj nazwe nowego katalogu: "); scanf("%s", subFolderName);
printf("Podaj katalog w ktorym ma sie znajdowac nowy katalog: "); scanf("%s", parentFolderName);
q = findFolder(T, parentFolderName);
if (q != NULL){
printf("\nZnaleziono folder /%s\n", parentFolderName);
T = addNewSubFolder(T, q, subFolderName);
}
else printf("\nNie znaleziono folderu /%s\n", parentFolderName);
break;
case 2:
printf("Podaj nazwe nowego pliku: "); scanf("%s", fileName);
printf("Podaj katalog w ktorym ma sie znajdowac nowy katalog: "); scanf("%s", parentFolderName);
q = findFolder(T, parentFolderName);
if (q != NULL){
printf("\nZnaleziono folder /%s\n", parentFolderName);
T = addNewFile(T, q, fileName);
}
else printf("\nNie znaleziono folderu /%s\n", parentFolderName);
break;
case 3:
printf("Podaj nazwe katalogu, ktory chcesz usunac: "); scanf("%s", subFolderName);
q = findFolder(T, subFolderName);
if (q != NULL){
printf("\nZnaleziono folder /%s\n", subFolderName);
}
else printf("\nNie znaleziono folderu /%s\n", subFolderName);
T = removeFolder(T, q);
break;
}
system("cls");
goto menu;
getchar();
getchar();
return 0;
}