Advertisement
Crackbone

SP-Zadatak8

Jan 10th, 2020
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.02 KB | None | 0 0
  1. /*8. Napisati program koji pomoću vezanih listi (stabala) predstavlja strukturu direktorija.
  2. Omogućiti unos novih direktorija i pod-direktorija, ispis sadržaja direktorija i
  3. povratak u prethodni direktorij. Točnije program treba preko menija simulirati
  4. korištenje DOS naredbi: 1- "md", 2 - "cd dir", 3 - "cd..", 4 - "dir" i 5 – izlaz.
  5. */
  6.  
  7.  
  8.  
  9.  
  10.  
  11. #define _CRT_SECURE_NO_WARNINGS
  12. #define MAXCHAR 100
  13.  
  14. #include<stdio.h>
  15. #include<string.h>
  16. #include<stdlib.h>
  17. #include<errno.h>
  18. #include<stdbool.h>
  19.  
  20.  
  21.  
  22.  
  23. typedef struct dir;
  24. typedef struct dir* Pointer_dir;
  25.  
  26. struct dir
  27. {
  28.     char Name[MAXCHAR];
  29.     Pointer_dir Children_list;
  30.     Pointer_dir Parent;
  31.     Pointer_dir Sibiling_Next;
  32.    
  33. };
  34.  
  35. //ClearScren
  36. void clrscr()
  37. {
  38.     system("@cls||clear");
  39. }
  40.  
  41. //Funkcije
  42. Pointer_dir create_child(Pointer_dir Parent, char *dir_name);
  43. int children_list_managing(Pointer_dir Parent, char *dir_name);
  44. Pointer_dir enter_folder(Pointer_dir Parent, char *dir_name);
  45. void directory_content(Pointer_dir Parent);
  46. Pointer_dir returning_to_parent(Pointer_dir Parent);
  47. void show_path(Pointer_dir Parent);
  48.  
  49. int main()
  50. {
  51.     char buffer[MAXCHAR];
  52.     char *function; //Odabrana funkcija
  53.     char *dir_name; //Ime datoteke koju zelimo napravit
  54.     bool x = true;
  55.     struct dir cdisk;
  56.     strcpy(cdisk.Name, "c:");
  57.     cdisk.Parent = NULL;
  58.     cdisk.Children_list = NULL;
  59.     cdisk.Sibiling_Next = NULL;
  60.     Pointer_dir Current_folder = &cdisk;
  61.    
  62.  
  63.     while (x == true)
  64.     {
  65.         clrscr();
  66.         //Ovde treba doc funkcija koja opisuje path di se nalazimo;
  67.         show_path(Current_folder);
  68.         scanf("%[^\n]", buffer);
  69.         getchar();
  70.        
  71.         function = strtok(buffer, " ");
  72.        
  73.         printf("%d", strcmp(function, "md"));
  74.  
  75.         //I sad razliciti slucajevi
  76.         if (0 == strcmp(function, "md"))
  77.         {
  78.             dir_name = strtok(NULL, " ");
  79.             children_list_managing(Current_folder, dir_name);
  80.         }
  81.         else if (0 == strcmp(function, "dir"))
  82.         {
  83.             directory_content(Current_folder);
  84.             getchar();
  85.         }
  86.         else if (0 == strcmp(function, "cd"))
  87.         {
  88.             dir_name = strtok(NULL, " ");
  89.             Current_folder = enter_folder(Current_folder, dir_name);
  90.         }
  91.         else if (0 == strcmp(function, "cd.."))
  92.         {
  93.             Current_folder = returning_to_parent(Current_folder);
  94.         }
  95.     }
  96.  
  97.     getchar();
  98.     getchar();
  99.     return 1;
  100. }
  101. //Stvaranje deteta;  sad za ovo onaj treba bit da dodaje u children list ovaj q, a salje Pointer od roota, i ime direktorija
  102. //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
  103. Pointer_dir create_child(Pointer_dir Parent, char *dir_name)
  104. {
  105.     Pointer_dir q = (Pointer_dir)malloc(sizeof(struct dir));
  106.     if (NULL == q)
  107.     {
  108.         printf("Greska prilikom alokacije memorije. Error: %d", errno);
  109.         getchar();
  110.         return;
  111.     }
  112.     q->Children_list = NULL;
  113.     q->Parent = Parent;
  114.     strcpy(q->Name, dir_name);
  115.     q->Sibiling_Next = NULL;
  116.  
  117.     return q;
  118. }
  119.  
  120. //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
  121. //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
  122.  
  123. int children_list_managing(Pointer_dir Parent, char *dir_name)
  124. {
  125.     //Deklaracije i inicializacije, etc
  126.     Pointer_dir temp = NULL;
  127.     Pointer_dir iterator = NULL;
  128.     bool x = true;
  129.     //Funkcija u slucaju da je lista prazna, pa treba samo 1;
  130.     if (Parent->Children_list == NULL)
  131.     {  
  132.  
  133.         Parent->Children_list = create_child(Parent, dir_name);
  134.     }
  135.     else
  136.     {
  137.  
  138.         iterator = Parent->Children_list;
  139.  
  140.         while ((strcmp(iterator->Name,dir_name)<=0)&&(x==true))
  141.         {
  142.  
  143.             if (strcmp(iterator->Name, dir_name) == 0)
  144.             {
  145.                 printf("Vec postoji datoteka sa tim imenonm");
  146.                 getchar();
  147.                 return 1;
  148.             }
  149.             else if (iterator->Sibiling_Next != NULL)
  150.             {
  151.                 iterator = iterator->Sibiling_Next;
  152.             }
  153.             else
  154.                 x = false;
  155.         }
  156.         temp = create_child(Parent, dir_name);
  157.         temp->Sibiling_Next = iterator->Sibiling_Next;
  158.         iterator->Sibiling_Next = temp;
  159.     }
  160.  
  161.     return 1;
  162. }
  163.  
  164.  
  165. //Funkckcija CD; Treba vracat pointer na novi file, prima pointer od parenta i ime datoteke koju trazi;
  166.  
  167. Pointer_dir enter_folder(Pointer_dir Parent, char *dir_name)
  168. {
  169.     Pointer_dir Folder_we_are_looking_for = NULL;
  170.     Pointer_dir RealParent = Parent;
  171.     //Za ovo smece od funkcije postoji znaci 3 slucaja
  172.     if (Parent->Children_list == NULL)
  173.     {
  174.         printf("Nema trazenog direktorija\n");
  175.         getchar();
  176.         return Parent;
  177.     }
  178.     else
  179.     {
  180.         if (strcmp(Parent->Children_list->Name, dir_name) == 0)
  181.         {
  182.             Folder_we_are_looking_for = Parent->Children_list;
  183.             return Folder_we_are_looking_for;
  184.         }
  185.        
  186.         else if (Parent->Children_list->Sibiling_Next == NULL)
  187.         {
  188.             printf("\nNema trazenog direktorija\n");
  189.             getchar();
  190.             return Parent;
  191.         }
  192.         else
  193.         {
  194.             Parent = Parent->Children_list;
  195.             while ((strcmp(Parent->Sibiling_Next->Name, dir_name) != 0) && (Parent->Sibiling_Next != NULL))
  196.             {
  197.                 Parent = Parent->Sibiling_Next;
  198.  
  199.             }
  200.             if (strcmp(Parent->Name, dir_name) != 0)
  201.                 return RealParent;
  202.             Folder_we_are_looking_for = Parent;
  203.         }
  204.     }
  205.     return Folder_we_are_looking_for;
  206. }
  207.  
  208.  
  209. //Funkcija dir, koja u biti samo ispisuje sadrzaj direktorija, znaci ovo smece moze bit void, a treba samo imat ulaz parenta
  210. void directory_content(Pointer_dir Parent)
  211. {
  212.     if (Parent->Children_list == NULL)
  213.     {
  214.         printf("U direktoriju se ne nalazi nista\n");
  215.         return;
  216.     }
  217.     printf("\n %s", Parent->Children_list->Name);
  218.     Parent = Parent->Children_list;
  219.     while (Parent->Sibiling_Next != NULL)
  220.     {
  221.         printf("\n %s", Parent->Sibiling_Next->Name);
  222.         Parent = Parent->Sibiling_Next;
  223.     }
  224.     return;
  225. }
  226.  
  227. //Funkcija za vracanje cd..; eeee ovo je pickin dim zahvaljujuci parent u strukturi, bravo ja; isto treba bit pointer tipa i primat pointer
  228. Pointer_dir returning_to_parent(Pointer_dir Parent)
  229. {
  230.     Pointer_dir temp = NULL;
  231.     temp = Parent->Parent;
  232.     return temp;
  233. }
  234.  
  235. //Prikazivanje puta
  236.  
  237. void show_path(Pointer_dir Parent)
  238. {
  239.     if(Parent->Name!=NULL)
  240.     show_path(Parent->Parent);
  241.     printf(" %s/", Parent->Name);
  242. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement