Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Nome: Marco
- Cognome: Andronaco
- Matricola: O46001282
- */
- #define M 31
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- //TYPEDEF
- typedef struct s1 {
- char nome[M];
- char cognome[M];
- char telefono[M];
- int nposti;
- } InfoPrenotazione;
- typedef struct s2 {
- InfoPrenotazione info;
- struct s2 * next;
- } NodoCoda;
- typedef struct s3 {
- NodoCoda * primo;
- NodoCoda * ultimo;
- } Coda, * PCoda;
- typedef struct s4 {
- char codice[M];
- float prezzo;
- Coda prenotazioni;
- } InfoViaggio;
- typedef struct s5{
- InfoViaggio info;
- struct s5 * next;
- } NodoLista, * Lista;
- //FUNZIONI
- void inserisciViaggio (Lista *lis, InfoViaggio elem) {
- Lista s, t;
- /* caso di lista vuota */
- if (*lis == NULL) {
- *lis = malloc(sizeof(NodoLista));
- (*lis)->info = elem;
- (*lis)->next = NULL;
- return;
- }
- /* l'elemento va messo in prima posizione */
- if (strcmp((*lis)->info.codice, elem.codice) > 0) {
- s = malloc(sizeof(NodoLista));
- s->info = elem;
- s->next = *lis;
- *lis = s;
- return;
- }
- /* l'elemento va aggiunto al resto della lista */
- inserisciViaggio(&(*lis)->next, elem);
- }
- int stampaViaggi(Lista lis){
- if (lis == NULL) {
- return 0;
- } else {
- printf("\nCodice: %s\nPrezzo: %f\n", lis->info.codice, lis->info.prezzo);
- if (lis->info.prenotazioni.primo != NULL) {
- printf("Prima prenotazione: %s %s\n", lis->info.prenotazioni.primo->info.nome, lis->info.prenotazioni.primo->info.cognome);
- }
- stampaViaggi(lis->next);
- }
- }
- int ricercaViaggio(Lista lis, char codice[]){
- if (lis == NULL)
- return 0;
- if (strcmp(lis->info.codice, codice) == 0) {
- return 1;
- }
- else
- ricercaViaggio(lis->next, codice);
- }
- int posizioneViaggio(Lista lis, char codice[]){
- int i = 0;
- while (lis != NULL) {
- i++;
- if (strcmp(lis->info.codice, codice) == 0) {
- return i;
- }
- lis = lis->next;
- }
- return 0;
- }
- int inserisciPrenotazione (Lista * lis, char codice[], InfoPrenotazione elem) {
- //vado al viaggio giusto scorrendo la lista
- Lista aux = *lis;
- int i = 1, n = posizioneViaggio(aux, codice);
- while (i < n) {
- aux = aux->next;
- i++;
- }
- //inserimento in coda su aux
- Coda caux = aux->info.prenotazioni;
- if (caux.primo == NULL) {
- //caso in cui la coda e' vuota
- caux.primo = malloc(sizeof(NodoCoda));
- if (caux.primo == NULL) {
- puts("Errore nell'allocazione dinamica");
- exit(0);
- }
- caux.primo->info = elem;
- caux.primo->next = NULL;
- caux.ultimo = caux.primo;
- }
- else {
- //caso in cui ci sono altri elementi in coda
- NodoCoda * caux2, * caux3;
- caux2 = malloc(sizeof(NodoCoda));
- if (caux2 == NULL) {
- puts("Errore nell'allocazione dinamica");
- exit(0);
- }
- caux2->info = elem;
- caux2->next = NULL;
- caux.ultimo->next = caux2;
- caux.ultimo = caux2;
- }
- (*lis)->info.prenotazioni = caux;
- }
- int eliminaPrenotazione(Lista * lis, char codice[], int verifica){
- //vado al viaggio giusto scorrendo la lista
- Lista aux = *lis;
- int i = 1, n = posizioneViaggio(*lis, codice);
- while (i < n) {
- aux = aux->next;
- i++;
- }
- if (verifica == 1) {
- int k;
- 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);
- do {
- scanf("%d", &k);
- } while (k != 0 && k != 1);
- if (k == 0) {
- return;
- }
- }
- if (aux->info.prenotazioni.primo == aux->info.prenotazioni.ultimo) {
- free(aux->info.prenotazioni.primo);
- aux->info.prenotazioni.primo = NULL;
- aux->info.prenotazioni.ultimo = NULL;
- }
- else {
- NodoCoda * aux2 = aux->info.prenotazioni.primo;
- aux->info.prenotazioni.primo = aux->info.prenotazioni.primo->next;
- free(aux2);
- }
- }
- void eliminaViaggio(Lista * lis, char codice[]){
- //vado al viaggio giusto scorrendo la lista
- Lista curr = *lis;
- Lista prev = NULL;
- while (strcmp(curr->info.codice, codice) != 0) {
- prev = curr;
- curr = curr->next;
- }
- while (curr->info.prenotazioni.primo != NULL) {
- eliminaPrenotazione(curr, codice, 0);
- }
- if (prev == NULL) {
- //primo elemento
- *lis = curr->next;
- free(curr);
- return;
- }
- prev->next = curr->next;
- free(curr);
- }
- //MAIN
- int main(void){
- int a;
- FILE * fp;
- Lista lis = NULL;
- InfoViaggio temp;
- InfoPrenotazione tempp;
- temp.prenotazioni.primo = NULL;
- temp.prenotazioni.ultimo = NULL;
- fp = fopen("viaggi.txt", "r");
- //Carico l'elenco dei viaggi da file
- if (fp == NULL){
- puts("Impossibile aprire il file.");
- return 0;
- }
- int v = 2;
- while (v == 2) {
- v = fscanf(fp, "%s %f", temp.codice, &temp.prezzo);
- if (v == 2)
- inserisciViaggio(&lis, temp);
- }
- fclose(fp);
- puts("File viaggi.txt caricato con successo.\n");
- int scelta;
- do{//MENU
- puts("\nCosa vuoi fare?");
- puts("1. Visualizza la lista viaggi");
- puts("2. Inserisci un nuovo viaggio");
- puts("3. Inserisci una prenotazione");
- puts("4. Elimina un viaggio");
- puts("5. Elimina una prenotazione");
- puts("0. Esci dal programma");
- printf("\nInserisci ora la tua scelta: ");
- scanf("%d", &scelta);
- switch (scelta) {
- case 0:
- break;
- case 1:
- stampaViaggi(lis);
- break;
- case 2:
- printf("Inserisci un codice viaggio: ");
- scanf("%s", temp.codice);
- a = ricercaViaggio(lis, temp.codice);
- if (a == 0) {
- printf("Inserisci un prezzo: ");
- scanf("%f", &temp.prezzo);
- inserisciViaggio(&lis, temp);
- }
- else
- puts("Il viaggio inserito e' gia' in elenco!");
- break;
- case 3:
- printf("Inserisci un codice viaggio: ");
- scanf("%s", temp.codice);
- a = ricercaViaggio(lis, temp.codice);
- if (a == 0)
- puts("Il viaggio inserito non e' in elenco. Aggiungilo e riprova.");
- else{
- puts("Inserisci, in ordine, <nome> <cognome> <telefono> e <numero di posti> della prenotazione da aggiungere.");
- scanf("%s %s %s %d", tempp.nome, tempp.cognome, tempp.telefono, &tempp.nposti);
- inserisciPrenotazione(&lis, temp.codice, tempp);
- puts("Fatto!\n");
- }
- break;
- case 4:
- printf("Inserisci un codice viaggio: ");
- scanf("%s", temp.codice);
- a = ricercaViaggio(lis, temp.codice);
- if (a == 0)
- puts("Il viaggio inserito non e' in elenco.");
- else{
- eliminaViaggio(&lis, temp.codice);
- puts("Fatto!\n");
- }
- break;
- case 5:
- printf("Inserisci un codice viaggio: ");
- scanf("%s", temp.codice);
- a = ricercaViaggio(lis, temp.codice);
- if (a == 0)
- puts("Il viaggio inserito non e' in elenco.");
- else{
- eliminaPrenotazione(&lis, temp.codice, 1);
- puts("Fatto!\n");
- }
- break;
- default:
- puts("Per favore inserisci un valore dell'elenco.");
- }
- } while (scelta != 0);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement