Advertisement
BiRabittoh

Agenzia viaggi

Apr 24th, 2017
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.63 KB | None | 0 0
  1. /*
  2. Nome: Marco
  3. Cognome: Andronaco
  4. Matricola: O46001282
  5. */
  6. #define M 31
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10.  
  11. //TYPEDEF
  12. typedef struct s1 {
  13.     char nome[M];
  14.     char cognome[M];
  15.     char telefono[M];
  16.     int nposti;
  17. } InfoPrenotazione;
  18.  
  19. typedef struct s2 {
  20.     InfoPrenotazione info;
  21.     struct s2 * next;
  22. } NodoCoda;
  23.  
  24. typedef struct s3 {
  25.     NodoCoda * primo;
  26.     NodoCoda * ultimo;
  27. } Coda, * PCoda;
  28.  
  29. typedef struct s4 {
  30.     char codice[M];
  31.     float prezzo;
  32.     Coda prenotazioni;
  33. } InfoViaggio;
  34.  
  35. typedef struct s5{
  36.     InfoViaggio info;
  37.     struct s5 * next;
  38. } NodoLista, * Lista;
  39.  
  40. //FUNZIONI
  41. void inserisciViaggio (Lista *lis, InfoViaggio elem) {
  42.     Lista s, t;
  43.  
  44.     /* caso di lista vuota */
  45.     if (*lis == NULL) {
  46.         *lis = malloc(sizeof(NodoLista));
  47.         (*lis)->info = elem;
  48.         (*lis)->next = NULL;
  49.         return;
  50.     }
  51.  
  52.     /* l'elemento va messo in prima posizione */
  53.     if (strcmp((*lis)->info.codice, elem.codice) > 0) {
  54.         s = malloc(sizeof(NodoLista));
  55.         s->info = elem;
  56.         s->next = *lis;
  57.         *lis = s;
  58.         return;
  59.     }
  60.  
  61.     /* l'elemento va aggiunto al resto della lista */
  62.     inserisciViaggio(&(*lis)->next, elem);
  63. }
  64. int stampaViaggi(Lista lis){
  65.     if (lis == NULL) {
  66.         return 0;
  67.     } else {
  68.         printf("\nCodice: %s\nPrezzo: %f\n", lis->info.codice, lis->info.prezzo);
  69.         if (lis->info.prenotazioni.primo != NULL) {
  70.             printf("Prima prenotazione: %s %s\n", lis->info.prenotazioni.primo->info.nome, lis->info.prenotazioni.primo->info.cognome);
  71.         }
  72.         stampaViaggi(lis->next);
  73.     }
  74. }
  75.  
  76. int ricercaViaggio(Lista lis, char codice[]){
  77.     if (lis == NULL)
  78.         return 0;
  79.     if (strcmp(lis->info.codice, codice) == 0) {
  80.         return 1;
  81.     }
  82.     else
  83.         ricercaViaggio(lis->next, codice);
  84. }
  85.  
  86. int posizioneViaggio(Lista lis, char codice[]){
  87.     int i = 0;
  88.     while (lis != NULL) {
  89.         i++;
  90.         if (strcmp(lis->info.codice, codice) == 0) {
  91.             return i;
  92.         }
  93.         lis = lis->next;
  94.     }
  95.     return 0;
  96. }
  97.  
  98. int inserisciPrenotazione (Lista * lis, char codice[], InfoPrenotazione elem) {
  99.     //vado al viaggio giusto scorrendo la lista
  100.     Lista aux = *lis;
  101.     int i = 1, n = posizioneViaggio(aux, codice);
  102.     while (i < n) {
  103.         aux = aux->next;
  104.         i++;
  105.     }
  106.     //inserimento in coda su aux
  107.     Coda caux = aux->info.prenotazioni;
  108.     if (caux.primo == NULL) {
  109.         //caso in cui la coda e' vuota
  110.         caux.primo = malloc(sizeof(NodoCoda));
  111.         if (caux.primo == NULL) {
  112.             puts("Errore nell'allocazione dinamica");
  113.             exit(0);
  114.         }
  115.         caux.primo->info = elem;
  116.         caux.primo->next = NULL;
  117.         caux.ultimo = caux.primo;
  118.     }
  119.     else {
  120.         //caso in cui ci sono altri elementi in coda
  121.         NodoCoda * caux2, * caux3;
  122.         caux2 = malloc(sizeof(NodoCoda));
  123.         if (caux2 == NULL) {
  124.             puts("Errore nell'allocazione dinamica");
  125.             exit(0);
  126.         }
  127.         caux2->info = elem;
  128.         caux2->next = NULL;
  129.         caux.ultimo->next = caux2;
  130.         caux.ultimo = caux2;
  131.     }
  132.     (*lis)->info.prenotazioni = caux;
  133. }
  134. int eliminaPrenotazione(Lista * lis, char codice[], int verifica){
  135.     //vado al viaggio giusto scorrendo la lista
  136.     Lista aux = *lis;
  137.     int i = 1, n = posizioneViaggio(*lis, codice);
  138.     while (i < n) {
  139.         aux = aux->next;
  140.         i++;
  141.     }
  142.     if (verifica == 1) {
  143.         int k;
  144.         printf("\nLa prima prenotazione per questo viaggio e' di %s %s. Sei sicuro di volerla eliminare? (0 = no, 1 = si)", aux->info.prenotazioni.primo->info.nome, aux->info.prenotazioni.primo->info.cognome);
  145.         do {
  146.             scanf("%d", &k);
  147.         } while (k != 0 && k != 1);
  148.         if (k == 0) {
  149.             return;
  150.         }
  151.     }
  152.  
  153.     if (aux->info.prenotazioni.primo == aux->info.prenotazioni.ultimo) {
  154.         free(aux->info.prenotazioni.primo);
  155.         aux->info.prenotazioni.primo = NULL;
  156.         aux->info.prenotazioni.ultimo = NULL;
  157.     }
  158.     else {
  159.         NodoCoda * aux2 = aux->info.prenotazioni.primo;
  160.         aux->info.prenotazioni.primo = aux->info.prenotazioni.primo->next;
  161.         free(aux2);
  162.     }
  163. }
  164. void eliminaViaggio(Lista * lis, char codice[]){
  165.     //vado al viaggio giusto scorrendo la lista
  166.     Lista curr = *lis;
  167.     Lista prev = NULL;
  168.     while (strcmp(curr->info.codice, codice) != 0) {
  169.         prev = curr;
  170.         curr = curr->next;
  171.     }
  172.     while (curr->info.prenotazioni.primo != NULL) {
  173.         eliminaPrenotazione(curr, codice, 0);
  174.     }
  175.     if (prev == NULL) {
  176.         //primo elemento
  177.         *lis = curr->next;
  178.         free(curr);
  179.         return;
  180.     }
  181.     prev->next = curr->next;
  182.     free(curr);
  183. }
  184.  
  185.  
  186. //MAIN
  187. int main(void){
  188.     int a;
  189.     FILE * fp;
  190.     Lista lis = NULL;
  191.     InfoViaggio temp;
  192.     InfoPrenotazione tempp;
  193.     temp.prenotazioni.primo = NULL;
  194.     temp.prenotazioni.ultimo = NULL;
  195.     fp = fopen("viaggi.txt", "r");
  196.     //Carico l'elenco dei viaggi da file
  197.     if (fp == NULL){
  198.         puts("Impossibile aprire il file.");
  199.         return 0;
  200.     }
  201.     int v = 2;
  202.     while (v == 2) {
  203.         v = fscanf(fp, "%s %f", temp.codice, &temp.prezzo);
  204.         if (v == 2)
  205.         inserisciViaggio(&lis, temp);
  206.     }
  207.     fclose(fp);
  208.     puts("File viaggi.txt caricato con successo.\n");
  209.     int scelta;
  210.     do{//MENU
  211.         puts("\nCosa vuoi fare?");
  212.         puts("1. Visualizza la lista viaggi");
  213.         puts("2. Inserisci un nuovo viaggio");
  214.         puts("3. Inserisci una prenotazione");
  215.         puts("4. Elimina un viaggio");
  216.         puts("5. Elimina una prenotazione");
  217.         puts("0. Esci dal programma");
  218.         printf("\nInserisci ora la tua scelta: ");
  219.         scanf("%d", &scelta);
  220.         switch (scelta) {
  221.         case 0:
  222.             break;
  223.         case 1:
  224.             stampaViaggi(lis);
  225.             break;
  226.         case 2:
  227.             printf("Inserisci un codice viaggio: ");
  228.             scanf("%s", temp.codice);
  229.             a = ricercaViaggio(lis, temp.codice);
  230.             if (a == 0) {
  231.                 printf("Inserisci un prezzo: ");
  232.                 scanf("%f", &temp.prezzo);
  233.                 inserisciViaggio(&lis, temp);
  234.             }
  235.             else
  236.                 puts("Il viaggio inserito e' gia' in elenco!");
  237.             break;
  238.         case 3:
  239.             printf("Inserisci un codice viaggio: ");
  240.             scanf("%s", temp.codice);
  241.             a = ricercaViaggio(lis, temp.codice);
  242.             if (a == 0)
  243.                 puts("Il viaggio inserito non e' in elenco. Aggiungilo e riprova.");
  244.             else{
  245.                 puts("Inserisci, in ordine, <nome> <cognome> <telefono> e <numero di posti> della prenotazione da aggiungere.");
  246.                 scanf("%s %s %s %d", tempp.nome, tempp.cognome, tempp.telefono, &tempp.nposti);
  247.                 inserisciPrenotazione(&lis, temp.codice, tempp);
  248.                 puts("Fatto!\n");
  249.             }
  250.             break;
  251.         case 4:
  252.             printf("Inserisci un codice viaggio: ");
  253.             scanf("%s", temp.codice);
  254.             a = ricercaViaggio(lis, temp.codice);
  255.             if (a == 0)
  256.                 puts("Il viaggio inserito non e' in elenco.");
  257.             else{
  258.                 eliminaViaggio(&lis, temp.codice);
  259.                 puts("Fatto!\n");
  260.             }
  261.            
  262.             break;
  263.         case 5:
  264.             printf("Inserisci un codice viaggio: ");
  265.             scanf("%s", temp.codice);
  266.             a = ricercaViaggio(lis, temp.codice);
  267.             if (a == 0)
  268.                 puts("Il viaggio inserito non e' in elenco.");
  269.             else{
  270.                 eliminaPrenotazione(&lis, temp.codice, 1);
  271.                 puts("Fatto!\n");
  272.             }
  273.             break;
  274.         default:
  275.             puts("Per favore inserisci un valore dell'elenco.");
  276.         }
  277.     } while (scelta != 0);
  278.     return 0;
  279. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement