Advertisement
TheRealSiV

Lab 3

Oct 13th, 2020 (edited)
470
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.46 KB | None | 0 0
  1. # include <stdlib.h>
  2. # include <stdio.h>
  3. # include <string.h>
  4.  
  5. typedef struct locomotiva
  6. {
  7.     int Id;
  8.     char *Tip;
  9.     float Greutate;
  10.     struct locomotiva *urm;
  11. } LOCOMOTIVA;
  12. typedef struct
  13. {
  14.     LOCOMOTIVA *prim, *ultim, *crt;
  15.     int dimensiune;
  16. } DEPOU;
  17. void Intrare(DEPOU *d); /* variabila d nu este transmisa prin referinta deoarece NU se
  18. modifica in interiorul functiei */
  19. void Iesire(DEPOU *d);
  20. void Afisare(DEPOU *d);
  21. void Populare(DEPOU **d); /* variabila d, de tip pointer la DEPOU, este transmisa prin
  22. referinta deoarece se modifica valoarea pointerului in interiorul functiei. Se va initializa
  23. in interiorul functiei. */
  24. void Salvare(DEPOU *d);
  25. int main()
  26. {
  27.     int optiune;
  28.     DEPOU *d;
  29.     Populare(&d);
  30.     while(1)
  31.     {
  32.         printf("1 Intrare, 2 Iesire, 3 Afisare, 4 Terminare ");
  33.         scanf("%d", &optiune);
  34.         switch(optiune)
  35.         {
  36.         case 1:
  37.         {
  38.             Intrare(d);
  39.             break;
  40.         }
  41.         case 2:
  42.         {
  43.             Iesire(d);
  44.             break;
  45.         }
  46.         case 3:
  47.         {
  48.             if(d->dimensiune == 0)
  49.             {
  50.                 printf("Depoul este gol...\n");
  51.             }
  52.             else
  53.             {
  54.                 Afisare(d);
  55.             }
  56.             break;
  57.         }
  58.         case 4:
  59.         {
  60.             printf("La revedere...");
  61.             Salvare(d);
  62.             return 0;
  63.         }
  64.         default:
  65.         {
  66.             printf("Optiune gresita...");
  67.             break;
  68.         }
  69.         }
  70.     }
  71.     return 0;
  72. }
  73. void Intrare(DEPOU *d)
  74. {
  75.     char buf[100];
  76.     d->crt = (LOCOMOTIVA *)malloc(sizeof(LOCOMOTIVA));
  77.     /* citire date in nodul de adresa d->crt */
  78.     printf("Introduceti Id = ");
  79.     scanf("%d", &(d->crt->Id));
  80.     printf("Introduceti Tip = ");
  81.     scanf("%s", buf);
  82.     d->crt->Tip = (char*)malloc((strlen(buf)+1)*sizeof(char));
  83.     strcpy(d->crt->Tip, buf);
  84.     printf("Introduceti Greutate = ");
  85.     scanf("%f", &(d->crt->Greutate));
  86.     d->dimensiune++;
  87.     if (d->prim == NULL)
  88.     {
  89.         d->crt->urm = 0;
  90.         d->prim = d->ultim = d->crt;
  91.     }
  92.     else
  93.     {
  94.         /* se insereaza inainte de primul nod */
  95.         d->crt->urm = d->prim;
  96.         d->prim = d->crt;
  97.     }
  98. }
  99. void Iesire(DEPOU *d)
  100. {
  101.     if(d->prim != NULL)
  102.     {
  103.         d->crt = d->prim;
  104.         printf("Locomotiva care iese are urmatoarele detalii: Id = %d Tip = %s Greutate= %f\n", d->crt->Id, d->crt->Tip, d->crt->Greutate);
  105.         d->prim = d->prim->urm;
  106.         free(d->crt->Tip); /* eliberarea spatiului de memorie pentru sirul de caractere alocat dinamic */
  107.         free(d->crt); /* eliberarea spatiului de memorie */
  108.         d->dimensiune--;
  109.         if(d->prim == NULL)
  110.         {
  111.             d->ultim = NULL; /* lista a devenit vida */
  112.         }
  113.     }
  114. }
  115. void Afisare(DEPOU *d)
  116. {
  117.     int i = 0;
  118.     d->crt = d->prim;
  119.     while(d->crt)
  120.     {
  121.         i++;
  122.         printf("Locomotiva %d are urmatoarele detalii: Id = %d Tip = %s Greutate =  %f\n", i, d->crt->Id, d->crt->Tip, d->crt->Greutate);
  123.         d->crt = d->crt->urm;
  124.     }
  125. }
  126. void Populare(DEPOU **d)
  127. {
  128.     *d = (DEPOU*)malloc(sizeof(DEPOU));
  129.     (*d)->prim = (*d)->ultim = NULL;
  130.     (*d)->dimensiune = 0;
  131.     FILE *f = fopen("depou.txt", "r");
  132.     if(!f)
  133.         return;
  134.     char buf[100];
  135.     while(!feof(f))
  136.     {
  137.         (*d)->crt = (LOCOMOTIVA *)malloc(sizeof(LOCOMOTIVA));
  138.         /* citire date in nodul de adresa d->crt */
  139.         fscanf(f, "%d", &((*d)->crt->Id));
  140.         fscanf(f, "%s", buf);
  141.         (*d)->crt->Tip = (char*)malloc((strlen(buf)+1)*sizeof(char));
  142.         strcpy((*d)->crt->Tip, buf);
  143.         fscanf(f, "%f", &((*d)->crt->Greutate));
  144.         (*d)->dimensiune++;
  145.         (*d)->crt->urm = 0;
  146.         if ((*d)->prim == NULL)
  147.         {
  148.             (*d)->prim = (*d)->ultim = (*d)->crt;
  149.         }
  150.         else
  151.         {
  152.             /* se adauga dupa ultimul nod */
  153.             (*d)->ultim->urm = (*d)->crt;
  154.             (*d)->ultim = (*d)->crt;
  155.         }
  156.     }
  157.     fclose(f);
  158. }
  159.  
  160. void Salvare(DEPOU *d)
  161. {
  162.     FILE *f = fopen("depou.txt", "w");
  163.     if(!f)
  164.         return;
  165.     d->crt = d->prim;
  166.     while(d->crt)
  167.     {
  168.         if(d->crt==d->ultim)
  169.         {
  170.             fprintf(f, "%d %s %f", d->crt->Id, d->crt->Tip, d->crt->Greutate);
  171.         }
  172.         else
  173.         {
  174.             fprintf(f, "%d %s %f\n", d->crt->Id, d->crt->Tip, d->crt->Greutate);
  175.         }
  176.         d->crt = d->crt->urm;
  177.     }
  178.     fclose(f);
  179. }
  180.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement