Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*8. Napisati program koji pomoću vezanih listi (stabala) predstavlja strukturu direktorija.
- Omogućiti unos novih direktorija i pod-direktorija, ispis sadržaja direktorija i
- povratak u prethodni direktorij. Točnije program treba preko menija simulirati
- korištenje DOS naredbi: 1- "md", 2 - "cd dir", 3 - "cd..", 4 - "dir" i 5 – izlaz.
- */
- #define _CRT_SECURE_NO_WARNINGS
- #define MAXCHAR 100
- #include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- #include<errno.h>
- #include<stdbool.h>
- typedef struct dir;
- typedef struct dir* Pointer_dir;
- struct dir
- {
- char Name[MAXCHAR];
- Pointer_dir Children_list;
- Pointer_dir Parent;
- Pointer_dir Sibiling_Next;
- };
- //ClearScren
- void clrscr()
- {
- system("@cls||clear");
- }
- //Funkcije
- Pointer_dir create_child(Pointer_dir Parent, char *dir_name);
- int children_list_managing(Pointer_dir Parent, char *dir_name);
- Pointer_dir enter_folder(Pointer_dir Parent, char *dir_name);
- void directory_content(Pointer_dir Parent);
- Pointer_dir returning_to_parent(Pointer_dir Parent);
- void show_path(Pointer_dir Parent);
- int main()
- {
- char buffer[MAXCHAR];
- char *function; //Odabrana funkcija
- char *dir_name; //Ime datoteke koju zelimo napravit
- bool x = true;
- struct dir cdisk;
- strcpy(cdisk.Name, "c:");
- cdisk.Parent = NULL;
- cdisk.Children_list = NULL;
- cdisk.Sibiling_Next = NULL;
- Pointer_dir Current_folder = &cdisk;
- while (x == true)
- {
- clrscr();
- //Ovde treba doc funkcija koja opisuje path di se nalazimo;
- show_path(Current_folder);
- scanf("%[^\n]", buffer);
- getchar();
- function = strtok(buffer, " ");
- printf("%d", strcmp(function, "md"));
- //I sad razliciti slucajevi
- if (0 == strcmp(function, "md"))
- {
- dir_name = strtok(NULL, " ");
- children_list_managing(Current_folder, dir_name);
- }
- else if (0 == strcmp(function, "dir"))
- {
- directory_content(Current_folder);
- getchar();
- }
- else if (0 == strcmp(function, "cd"))
- {
- dir_name = strtok(NULL, " ");
- Current_folder = enter_folder(Current_folder, dir_name);
- }
- else if (0 == strcmp(function, "cd.."))
- {
- Current_folder = returning_to_parent(Current_folder);
- }
- }
- getchar();
- getchar();
- return 1;
- }
- //Stvaranje deteta; sad za ovo onaj treba bit da dodaje u children list ovaj q, a salje Pointer od roota, i ime direktorija
- //dobro kad ovo bolje promislim ovo bi tek trebalo bit u children listi, znaci prima adresu od parenta i ime, a vraca q koji ide u listu childrena
- Pointer_dir create_child(Pointer_dir Parent, char *dir_name)
- {
- Pointer_dir q = (Pointer_dir)malloc(sizeof(struct dir));
- if (NULL == q)
- {
- printf("Greska prilikom alokacije memorije. Error: %d", errno);
- getchar();
- return;
- }
- q->Children_list = NULL;
- q->Parent = Parent;
- strcpy(q->Name, dir_name);
- q->Sibiling_Next = NULL;
- return q;
- }
- //Stvaranje liste childrena, ovo bi trebalo stvarat listu sortiranu po imenima, i onda vracat [pointer na pocetak liste koji se spaja na Children_list od parenta
- //Takodjer treba dodavat nove elemente po potrebi.. Znaci prima pointer na roditelja, i ime direktorija, jer pointer za children list moze dobit iz parent pointera
- int children_list_managing(Pointer_dir Parent, char *dir_name)
- {
- //Deklaracije i inicializacije, etc
- Pointer_dir temp = NULL;
- Pointer_dir iterator = NULL;
- //Funkcija u slucaju da je lista prazna, pa treba samo 1;
- if (Parent->Children_list == NULL)
- {
- Parent->Children_list = create_child(Parent, dir_name);
- }
- else
- {
- iterator = Parent->Children_list;
- while ((strcmp(iterator->Name,dir_name)<=0)&&(iterator->Sibiling_Next!=NULL))
- {
- if (strcmp(iterator->Name, dir_name) == 0)
- {
- printf("Vec postoji datoteka sa tim imenonm");
- getchar();
- return 1;
- }
- else
- iterator = iterator->Sibiling_Next;
- }
- temp = create_child(Parent, dir_name);
- temp->Sibiling_Next = iterator->Sibiling_Next;
- iterator->Sibiling_Next = temp;
- }
- return 1;
- }
- //Funkckcija CD; Treba vracat pointer na novi file, prima pointer od parenta i ime datoteke koju trazi;
- Pointer_dir enter_folder(Pointer_dir Parent, char *dir_name)
- {
- Pointer_dir Folder_we_are_looking_for = NULL;
- Pointer_dir RealParent = Parent;
- //Za ovo smece od funkcije postoji znaci 3 slucaja
- if (Parent->Children_list == NULL)
- {
- printf("Nema trazenog direktorija\n");
- getchar();
- return Parent;
- }
- else
- {
- if (strcmp(Parent->Children_list->Name, dir_name) == 0)
- {
- Folder_we_are_looking_for = Parent->Children_list;
- return Folder_we_are_looking_for;
- }
- else if (Parent->Children_list->Sibiling_Next == NULL)
- {
- printf("\nNema trazenog direktorija\n");
- getchar();
- return Parent;
- }
- else
- {
- Parent = Parent->Children_list;
- while ((strcmp(Parent->Sibiling_Next->Name, dir_name) != 0) && (Parent->Sibiling_Next != NULL))
- {
- Parent = Parent->Sibiling_Next;
- }
- if (strcmp(Parent->Name, dir_name) != 0)
- return RealParent;
- Folder_we_are_looking_for = Parent;
- }
- }
- return Folder_we_are_looking_for;
- }
- //Funkcija dir, koja u biti samo ispisuje sadrzaj direktorija, znaci ovo smece moze bit void, a treba samo imat ulaz parenta
- void directory_content(Pointer_dir Parent)
- {
- if (Parent->Children_list == NULL)
- {
- printf("U direktoriju se ne nalazi nista\n");
- return;
- }
- printf("\n %s", Parent->Children_list->Name);
- Parent = Parent->Children_list;
- while (Parent->Sibiling_Next != NULL)
- {
- printf("\n %s", Parent->Sibiling_Next->Name);
- Parent = Parent->Sibiling_Next;
- }
- return;
- }
- //Funkcija za vracanje cd..; eeee ovo je pickin dim zahvaljujuci parent u strukturi, bravo ja; isto treba bit pointer tipa i primat pointer
- Pointer_dir returning_to_parent(Pointer_dir Parent)
- {
- Pointer_dir temp = NULL;
- temp = Parent->Parent;
- return temp;
- }
- //Prikazivanje puta
- void show_path(Pointer_dir Parent)
- {
- if(Parent->Name!=NULL)
- show_path(Parent->Parent);
- printf(" %s/", Parent->Name);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement