Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Prof. O. Tomarchio
- *******************************************************************/
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- // Dichiarazione Struttura dati
- // dichiarazione tipo coda
- typedef struct prenot {
- char nome[64];
- char cognome[64];
- char tel[20];
- unsigned short num;
- } TipoElemCoda;
- typedef struct nodoCoda {
- TipoElemCoda info;
- struct nodoCoda *next;
- } TipoNodoCoda;
- typedef struct StructCoda {
- TipoNodoCoda *primo, *ultimo;
- } TipoCoda;
- // dichiarazione tipo lista
- typedef struct viaggio {
- char codice[8];
- float prezzo;
- TipoCoda codaprenotazioni;
- } TipoElemLista;
- typedef struct StructLista {
- TipoElemLista info;
- struct StructLista *next;
- }TipoNodoLista;
- typedef TipoNodoLista *TipoLista;
- /* funzioni di base sulla coda */
- /* InitCoda */
- void InitCoda(TipoCoda *c) {
- c->primo = NULL;
- c->ultimo = NULL;
- }
- /* TestCodaVuota */
- int TestCodaVuota(TipoCoda c) {
- return (c.primo == NULL);
- }
- /* InizioCoda: */
- TipoElemCoda InizioCoda(TipoCoda c) {
- return ((c.primo)->info);
- }
- /* InCoda */
- void InCoda(TipoCoda *c, TipoElemCoda v) {
- if (TestCodaVuota(*c)) {
- /* c e' vuota: l'elemento da inserire sara' sia
- il primo che l'ultimo elemento della coda */
- if ((c->primo = (TipoNodoCoda *)malloc(sizeof(TipoNodoCoda))) == NULL) {
- printf("Errore allocazione di memoria");
- exit(1);
- }
- c->ultimo = c->primo;
- }
- else {
- if ((c->ultimo->next = (TipoNodoCoda *)malloc(sizeof(TipoNodoCoda))) == NULL) {
- printf("Errore allocazione di memoria");
- exit(1);
- }
- c->ultimo = c->ultimo->next;
- }
- c->ultimo->info = v;
- c->ultimo->next = NULL;
- }
- /* OutCoda */
- TipoElemCoda OutCoda(TipoCoda *c) {
- TipoElemCoda v;
- TipoNodoCoda *paux;
- v = InizioCoda(*c); /* copia il valore del primo elemento
- di c in v (se esiste) */
- if (c->primo != NULL) { /* elimina il primo elemento
- di c (se esiste) */
- paux = c->primo; /* 1 */
- c->primo = c->primo->next; /* 2 */
- free(paux); /* 3 */
- }
- /* se l'elemento eliminato era l'unico elemento presente nella coda,
- allora si pone a NULL anche il puntatore all'ultimo elemento */
- if (c->primo == NULL)
- c->ultimo = NULL;
- return v;
- }
- /* Fine funzioni di base sulla coda */
- /* SvuotaCoda: svuota la coda liberando la memoria occupata */
- void SvuotaCoda(TipoCoda *c) {
- while (!TestCodaVuota(*c))
- OutCoda(c);
- }
- /*** Punto 3 ***/
- void InserisciInListaOrdinata(TipoLista *lis, TipoElemLista elem) {
- TipoLista paux, corr, prec;
- // Creo il nuovo nodo della lista
- if ((paux = (TipoLista)malloc(sizeof(TipoNodoLista))) == NULL) {
- printf("Errore: impossibile allocare memoria");
- exit(1);
- }
- paux->info = elem;
- // Scorro la lista fino a che trovo un elemento maggiore
- // Scorro la lista con due puntatori: prec e corr
- corr = *lis;
- prec = NULL;
- while (corr != NULL && strcmp(corr->info.codice, elem.codice)<0 ) {
- prec = corr;
- corr = corr->next;
- }
- paux->next = corr; // concateno il nuovo elemento nella posizione trovata
- if (prec != NULL)
- prec->next = paux; // il nuovo elemento non ΓΒ¨ il primo della lista
- else
- *lis = paux; // il nuovo elemento sarΓ il primo della lista
- }
- int EsisteInLista(TipoLista lis, char *codice) {
- int trovato = 0; /* indica se l'elemento e` stato trovato */
- while (lis != NULL && !trovato) {
- if (strcmp(lis->info.codice, codice)==0)
- trovato = 1; /* forza l'uscita dal ciclo */
- else
- lis = lis->next;
- }
- return trovato;
- }
- int CaricaLista(char* nomefile, TipoLista *lis) {
- FILE* fp;
- TipoElemLista elem;
- int ncaricati = 0;
- if ((fp = fopen(nomefile, "r")) == NULL) {
- printf("Errore apertura file\n");
- exit(1);
- }
- while (fscanf(fp, "%s", elem.codice) == 1) {
- fscanf(fp, "%f", &elem.prezzo);
- InitCoda(&(elem.codaprenotazioni));
- if (!EsisteInLista(*lis, elem.codice)) {
- InserisciInListaOrdinata(lis, elem);
- ncaricati++;
- }
- }
- fclose(fp);
- return ncaricati;
- }
- /*** Punto 4 ***/
- void VisualizzaListaViaggi(TipoLista lis) {
- TipoCoda prenotazioni;
- TipoElemCoda p;
- while (lis != NULL) {
- prenotazioni = lis->info.codaprenotazioni;
- printf("Codice Viaggio: %s\nCosto %.2f\n", lis->info.codice, lis->info.prezzo);
- if (!TestCodaVuota(prenotazioni)) {
- p = InizioCoda(prenotazioni);
- printf("Prima prenotazione: %s %s %s %d\n", p.cognome, p.nome, p.tel, p.num);
- }
- else
- printf("Nessuna prenotazione\n");
- lis = lis->next;
- }
- }
- /*** Punto 5 ***/
- void InserimentoNuovoViaggio(TipoLista *lis) {
- TipoElemLista elem;
- printf("Inserisci i dati di un nuovo viaggio\n");
- printf("Codice: ");
- scanf("%s", elem.codice);
- printf("Prezzo: ");
- scanf("%f", &elem.prezzo);
- InitCoda(&(elem.codaprenotazioni));
- if (!EsisteInLista(*lis, elem.codice)) {
- InserisciInListaOrdinata(lis, elem);
- printf("Nuovo viaggio inserito\n");
- }
- }
- /*** Punto 6 ***/
- TipoLista RicercaViaggio(TipoLista lis, char* codice){
- while (lis != NULL) {
- if (strcmp(lis->info.codice, codice) == 0)
- return (lis);
- lis = lis->next;
- }
- return(lis);
- }
- void InserisciNuovaPrenotazione(TipoLista lis) {
- TipoElemCoda p;
- TipoLista pviaggio;
- char codiceviaggio[8];
- printf("Inserisci codice di viaggio per nuova prenotazione: ");
- scanf("%s", codiceviaggio);
- pviaggio = RicercaViaggio(lis, codiceviaggio); // cerco un viaggio con il codice fornito
- if (pviaggio != NULL) {
- printf("Dati prenotazione\n");
- printf("Nome: ");
- scanf("%s", p.nome);
- printf("Cognome: ");
- scanf("%s", p.cognome);
- printf("Telefono: ");
- scanf("%s", p.tel);
- printf("Numero passeggeri: ");
- scanf("%hu", &p.num);
- InCoda(&(pviaggio->info.codaprenotazioni), p);
- }
- else
- printf("Errore: codice viaggio non presente\n");
- }
- /*** Punto 7 ***/
- void VisualizzaEliminaPrenotazione(TipoLista lis) {
- TipoElemCoda p;
- TipoLista pviaggio;
- char codiceviaggio[8];
- printf("Inserisci codice di viaggio per visualizzare prima prenotazione e rimuoverla: ");
- scanf("%s", codiceviaggio);
- pviaggio = RicercaViaggio(lis, codiceviaggio); // cerco un viaggio con il codice fornito
- if (pviaggio != NULL) {
- if (!TestCodaVuota(pviaggio->info.codaprenotazioni)) {
- p = OutCoda(&(pviaggio->info.codaprenotazioni));
- printf("Prima prenotazione: %s %s %s %d\n", p.cognome, p.nome, p.tel, p.num);
- printf("Prenotazione rimossa dalla coda\n");
- }
- else
- printf("Nessuna prenotazione presente\n");
- }
- else
- printf("Errore: codice viaggio non presente\n");
- }
- /*** Punto 8 ***/
- void CancellaElementoLista(TipoLista *lis, char *codice) {
- TipoLista paux;
- if (*lis != NULL)
- if (strcmp((*lis)->info.codice, codice)==0) { /* cancella il primo elemento */
- paux = *lis;
- *lis = (*lis)->next;
- free(paux);
- }
- else /* cancella elem dal resto */
- CancellaElementoLista(&(*lis)->next, codice);
- }
- void EliminaViaggio(TipoLista *lis) {
- TipoLista pviaggio;
- char codiceviaggio[8];
- printf("Inserisci codice di viaggio da eliminare: ");
- scanf("%s", codiceviaggio);
- pviaggio = RicercaViaggio(*lis, codiceviaggio); // cerco un viaggio con il codice fornito
- if (pviaggio != NULL) {
- SvuotaCoda(&(pviaggio->info.codaprenotazioni));
- printf("Coda prenotazioni svuotata\n");
- CancellaElementoLista(lis, codiceviaggio);
- printf("Viaggio cancellato dalla lista\n");
- }
- else
- printf("Errore: codice viaggio non presente\n");
- }
- int Menu() {
- int scelta;
- printf("***** MENU' DI SCELTA ******\n");
- printf("3 - Caricamento lista da file\n");
- printf("4 - Visualizzazione intera struttura dati\n");
- printf("5 - Inserimento nuovo viaggio in lista\n");
- printf("6 - Inserimento nuova prenotazione in coda\n");
- printf("7 - Visualizzazione prima prenotazione in coda (e successiva cancellazione)\n");
- printf("8 - Cancellazione viaggio (e svuotamento relativa coda prenotazioni)\n");
- printf("0 - Fine programma\n");
- printf("\nInserisci una scelta ----> ");
- scanf("%d", &scelta);
- return scelta;
- }
- int main(void) {
- TipoLista listaviaggi=NULL;
- int scelta, n;
- char nomefile[] = "viaggi.txt";
- do {
- scelta = Menu();
- switch (scelta) {
- case 3:
- n = CaricaLista(nomefile, &listaviaggi);
- printf("Sono stati caricati %d viaggi\n", n);
- break;
- case 4:
- VisualizzaListaViaggi(listaviaggi);
- break;
- case 5:
- InserimentoNuovoViaggio(&listaviaggi);
- break;
- case 6:
- InserisciNuovaPrenotazione(listaviaggi);
- break;
- case 7:
- VisualizzaEliminaPrenotazione(listaviaggi);
- break;
- case 8:
- EliminaViaggio(&listaviaggi);
- break;
- }
- } while (scelta != 0);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement