Advertisement
Crackbone

Vjezba8

Jan 10th, 2020
263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.95 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.     //Funkcija u slucaju da je lista prazna, pa treba samo 1;
  129.     if (Parent->Children_list == NULL)
  130.     {  
  131.  
  132.         Parent->Children_list = create_child(Parent, dir_name);
  133.     }
  134.     else
  135.     {
  136.  
  137.         iterator = Parent->Children_list;
  138.  
  139.         while ((strcmp(iterator->Name,dir_name)<=0)&&(iterator->Sibiling_Next!=NULL))
  140.         {
  141.  
  142.             if (strcmp(iterator->Name, dir_name) == 0)
  143.             {
  144.                 printf("Vec postoji datoteka sa tim imenonm");
  145.                 getchar();
  146.                 return 1;
  147.             }
  148.             else
  149.                 iterator = iterator->Sibiling_Next;
  150.         }
  151.         temp = create_child(Parent, dir_name);
  152.         temp->Sibiling_Next = iterator->Sibiling_Next;
  153.         iterator->Sibiling_Next = temp;
  154.     }
  155.  
  156.     return 1;
  157. }
  158.  
  159.  
  160. //Funkckcija CD; Treba vracat pointer na novi file, prima pointer od parenta i ime datoteke koju trazi;
  161.  
  162. Pointer_dir enter_folder(Pointer_dir Parent, char *dir_name)
  163. {
  164.     Pointer_dir Folder_we_are_looking_for = NULL;
  165.     Pointer_dir RealParent = Parent;
  166.     //Za ovo smece od funkcije postoji znaci 3 slucaja
  167.     if (Parent->Children_list == NULL)
  168.     {
  169.         printf("Nema trazenog direktorija\n");
  170.         getchar();
  171.         return Parent;
  172.     }
  173.     else
  174.     {
  175.         if (strcmp(Parent->Children_list->Name, dir_name) == 0)
  176.         {
  177.             Folder_we_are_looking_for = Parent->Children_list;
  178.             return Folder_we_are_looking_for;
  179.         }
  180.        
  181.         else if (Parent->Children_list->Sibiling_Next == NULL)
  182.         {
  183.             printf("\nNema trazenog direktorija\n");
  184.             getchar();
  185.             return Parent;
  186.         }
  187.         else
  188.         {
  189.             Parent = Parent->Children_list;
  190.             while ((strcmp(Parent->Sibiling_Next->Name, dir_name) != 0) && (Parent->Sibiling_Next != NULL))
  191.             {
  192.                 Parent = Parent->Sibiling_Next;
  193.  
  194.             }
  195.             if (strcmp(Parent->Name, dir_name) != 0)
  196.                 return RealParent;
  197.             Folder_we_are_looking_for = Parent;
  198.         }
  199.     }
  200.     return Folder_we_are_looking_for;
  201. }
  202.  
  203.  
  204. //Funkcija dir, koja u biti samo ispisuje sadrzaj direktorija, znaci ovo smece moze bit void, a treba samo imat ulaz parenta
  205. void directory_content(Pointer_dir Parent)
  206. {
  207.     if (Parent->Children_list == NULL)
  208.     {
  209.         printf("U direktoriju se ne nalazi nista\n");
  210.         return;
  211.     }
  212.     printf("\n %s", Parent->Children_list->Name);
  213.     Parent = Parent->Children_list;
  214.     while (Parent->Sibiling_Next != NULL)
  215.     {
  216.         printf("\n %s", Parent->Sibiling_Next->Name);
  217.         Parent = Parent->Sibiling_Next;
  218.     }
  219.     return;
  220. }
  221.  
  222. //Funkcija za vracanje cd..; eeee ovo je pickin dim zahvaljujuci parent u strukturi, bravo ja; isto treba bit pointer tipa i primat pointer
  223. Pointer_dir returning_to_parent(Pointer_dir Parent)
  224. {
  225.     Pointer_dir temp = NULL;
  226.     temp = Parent->Parent;
  227.     return temp;
  228. }
  229.  
  230. //Prikazivanje puta
  231.  
  232. void show_path(Pointer_dir Parent)
  233. {
  234.     if(Parent->Name!=NULL)
  235.     show_path(Parent->Parent);
  236.     printf(" %s/", Parent->Name);
  237. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement