Advertisement
Guest User

Untitled

a guest
Sep 24th, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.73 KB | None | 0 0
  1. Prof. O. Tomarchio
  2. *******************************************************************/
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6.  
  7. // Dichiarazione Struttura dati
  8. // dichiarazione tipo coda
  9. typedef struct prenot {
  10. char nome[64];
  11. char cognome[64];
  12. char tel[20];
  13. unsigned short num;
  14. } TipoElemCoda;
  15.  
  16. typedef struct nodoCoda {
  17. TipoElemCoda info;
  18. struct nodoCoda *next;
  19. } TipoNodoCoda;
  20.  
  21. typedef struct StructCoda {
  22. TipoNodoCoda *primo, *ultimo;
  23. } TipoCoda;
  24.  
  25. // dichiarazione tipo lista
  26. typedef struct viaggio {
  27. char codice[8];
  28. float prezzo;
  29. TipoCoda codaprenotazioni;
  30. } TipoElemLista;
  31.  
  32. typedef struct StructLista {
  33. TipoElemLista info;
  34. struct StructLista *next;
  35. }TipoNodoLista;
  36.  
  37. typedef TipoNodoLista *TipoLista;
  38.  
  39.  
  40. /* funzioni di base sulla coda */
  41.  
  42. /* InitCoda */
  43. void InitCoda(TipoCoda *c) {
  44. c->primo = NULL;
  45. c->ultimo = NULL;
  46. }
  47.  
  48. /* TestCodaVuota */
  49. int TestCodaVuota(TipoCoda c) {
  50. return (c.primo == NULL);
  51. }
  52.  
  53. /* InizioCoda: */
  54. TipoElemCoda InizioCoda(TipoCoda c) {
  55.  
  56. return ((c.primo)->info);
  57. }
  58.  
  59. /* InCoda */
  60. void InCoda(TipoCoda *c, TipoElemCoda v) {
  61.  
  62. if (TestCodaVuota(*c)) {
  63. /* c e' vuota: l'elemento da inserire sara' sia
  64. il primo che l'ultimo elemento della coda */
  65. if ((c->primo = (TipoNodoCoda *)malloc(sizeof(TipoNodoCoda))) == NULL) {
  66. printf("Errore allocazione di memoria");
  67. exit(1);
  68. }
  69. c->ultimo = c->primo;
  70. }
  71. else {
  72. if ((c->ultimo->next = (TipoNodoCoda *)malloc(sizeof(TipoNodoCoda))) == NULL) {
  73. printf("Errore allocazione di memoria");
  74. exit(1);
  75. }
  76. c->ultimo = c->ultimo->next;
  77. }
  78. c->ultimo->info = v;
  79. c->ultimo->next = NULL;
  80. }
  81.  
  82. /* OutCoda */
  83. TipoElemCoda OutCoda(TipoCoda *c) {
  84.  
  85. TipoElemCoda v;
  86. TipoNodoCoda *paux;
  87.  
  88. v = InizioCoda(*c); /* copia il valore del primo elemento
  89. di c in v (se esiste) */
  90.  
  91. if (c->primo != NULL) { /* elimina il primo elemento
  92. di c (se esiste) */
  93. paux = c->primo; /* 1 */
  94. c->primo = c->primo->next; /* 2 */
  95. free(paux); /* 3 */
  96. }
  97.  
  98. /* se l'elemento eliminato era l'unico elemento presente nella coda,
  99. allora si pone a NULL anche il puntatore all'ultimo elemento */
  100. if (c->primo == NULL)
  101. c->ultimo = NULL;
  102.  
  103. return v;
  104. }
  105.  
  106. /* Fine funzioni di base sulla coda */
  107.  
  108. /* SvuotaCoda: svuota la coda liberando la memoria occupata */
  109. void SvuotaCoda(TipoCoda *c) {
  110. while (!TestCodaVuota(*c))
  111. OutCoda(c);
  112. }
  113.  
  114.  
  115.  
  116. /*** Punto 3 ***/
  117. void InserisciInListaOrdinata(TipoLista *lis, TipoElemLista elem) {
  118. TipoLista paux, corr, prec;
  119.  
  120. // Creo il nuovo nodo della lista
  121. if ((paux = (TipoLista)malloc(sizeof(TipoNodoLista))) == NULL) {
  122. printf("Errore: impossibile allocare memoria");
  123. exit(1);
  124. }
  125. paux->info = elem;
  126.  
  127. // Scorro la lista fino a che trovo un elemento maggiore
  128. // Scorro la lista con due puntatori: prec e corr
  129. corr = *lis;
  130. prec = NULL;
  131. while (corr != NULL && strcmp(corr->info.codice, elem.codice)<0 ) {
  132. prec = corr;
  133. corr = corr->next;
  134. }
  135.  
  136. paux->next = corr; // concateno il nuovo elemento nella posizione trovata
  137.  
  138. if (prec != NULL)
  139. prec->next = paux; // il nuovo elemento non è il primo della lista
  140. else
  141. *lis = paux; // il nuovo elemento sarà il primo della lista
  142. }
  143.  
  144. int EsisteInLista(TipoLista lis, char *codice) {
  145. int trovato = 0; /* indica se l'elemento e` stato trovato */
  146.  
  147. while (lis != NULL && !trovato) {
  148. if (strcmp(lis->info.codice, codice)==0)
  149. trovato = 1; /* forza l'uscita dal ciclo */
  150. else
  151. lis = lis->next;
  152. }
  153. return trovato;
  154. }
  155.  
  156. int CaricaLista(char* nomefile, TipoLista *lis) {
  157. FILE* fp;
  158. TipoElemLista elem;
  159. int ncaricati = 0;
  160.  
  161. if ((fp = fopen(nomefile, "r")) == NULL) {
  162. printf("Errore apertura file\n");
  163. exit(1);
  164. }
  165. while (fscanf(fp, "%s", elem.codice) == 1) {
  166. fscanf(fp, "%f", &elem.prezzo);
  167. InitCoda(&(elem.codaprenotazioni));
  168. if (!EsisteInLista(*lis, elem.codice)) {
  169. InserisciInListaOrdinata(lis, elem);
  170. ncaricati++;
  171. }
  172. }
  173. fclose(fp);
  174. return ncaricati;
  175. }
  176.  
  177.  
  178. /*** Punto 4 ***/
  179. void VisualizzaListaViaggi(TipoLista lis) {
  180. TipoCoda prenotazioni;
  181. TipoElemCoda p;
  182.  
  183. while (lis != NULL) {
  184. prenotazioni = lis->info.codaprenotazioni;
  185. printf("Codice Viaggio: %s\nCosto %.2f\n", lis->info.codice, lis->info.prezzo);
  186. if (!TestCodaVuota(prenotazioni)) {
  187. p = InizioCoda(prenotazioni);
  188. printf("Prima prenotazione: %s %s %s %d\n", p.cognome, p.nome, p.tel, p.num);
  189. }
  190. else
  191. printf("Nessuna prenotazione\n");
  192. lis = lis->next;
  193. }
  194. }
  195.  
  196.  
  197. /*** Punto 5 ***/
  198. void InserimentoNuovoViaggio(TipoLista *lis) {
  199. TipoElemLista elem;
  200.  
  201. printf("Inserisci i dati di un nuovo viaggio\n");
  202. printf("Codice: ");
  203. scanf("%s", elem.codice);
  204. printf("Prezzo: ");
  205. scanf("%f", &elem.prezzo);
  206. InitCoda(&(elem.codaprenotazioni));
  207. if (!EsisteInLista(*lis, elem.codice)) {
  208. InserisciInListaOrdinata(lis, elem);
  209. printf("Nuovo viaggio inserito\n");
  210. }
  211. }
  212.  
  213. /*** Punto 6 ***/
  214. TipoLista RicercaViaggio(TipoLista lis, char* codice){
  215.  
  216. while (lis != NULL) {
  217. if (strcmp(lis->info.codice, codice) == 0)
  218. return (lis);
  219. lis = lis->next;
  220. }
  221. return(lis);
  222. }
  223.  
  224. void InserisciNuovaPrenotazione(TipoLista lis) {
  225. TipoElemCoda p;
  226. TipoLista pviaggio;
  227. char codiceviaggio[8];
  228.  
  229. printf("Inserisci codice di viaggio per nuova prenotazione: ");
  230. scanf("%s", codiceviaggio);
  231. pviaggio = RicercaViaggio(lis, codiceviaggio); // cerco un viaggio con il codice fornito
  232. if (pviaggio != NULL) {
  233. printf("Dati prenotazione\n");
  234. printf("Nome: ");
  235. scanf("%s", p.nome);
  236. printf("Cognome: ");
  237. scanf("%s", p.cognome);
  238. printf("Telefono: ");
  239. scanf("%s", p.tel);
  240. printf("Numero passeggeri: ");
  241. scanf("%hu", &p.num);
  242. InCoda(&(pviaggio->info.codaprenotazioni), p);
  243. }
  244. else
  245. printf("Errore: codice viaggio non presente\n");
  246. }
  247.  
  248. /*** Punto 7 ***/
  249. void VisualizzaEliminaPrenotazione(TipoLista lis) {
  250. TipoElemCoda p;
  251. TipoLista pviaggio;
  252. char codiceviaggio[8];
  253.  
  254. printf("Inserisci codice di viaggio per visualizzare prima prenotazione e rimuoverla: ");
  255. scanf("%s", codiceviaggio);
  256. pviaggio = RicercaViaggio(lis, codiceviaggio); // cerco un viaggio con il codice fornito
  257. if (pviaggio != NULL) {
  258. if (!TestCodaVuota(pviaggio->info.codaprenotazioni)) {
  259. p = OutCoda(&(pviaggio->info.codaprenotazioni));
  260. printf("Prima prenotazione: %s %s %s %d\n", p.cognome, p.nome, p.tel, p.num);
  261. printf("Prenotazione rimossa dalla coda\n");
  262. }
  263. else
  264. printf("Nessuna prenotazione presente\n");
  265. }
  266. else
  267. printf("Errore: codice viaggio non presente\n");
  268. }
  269.  
  270. /*** Punto 8 ***/
  271. void CancellaElementoLista(TipoLista *lis, char *codice) {
  272. TipoLista paux;
  273.  
  274. if (*lis != NULL)
  275. if (strcmp((*lis)->info.codice, codice)==0) { /* cancella il primo elemento */
  276. paux = *lis;
  277. *lis = (*lis)->next;
  278. free(paux);
  279. }
  280. else /* cancella elem dal resto */
  281. CancellaElementoLista(&(*lis)->next, codice);
  282. }
  283.  
  284. void EliminaViaggio(TipoLista *lis) {
  285. TipoLista pviaggio;
  286. char codiceviaggio[8];
  287.  
  288. printf("Inserisci codice di viaggio da eliminare: ");
  289. scanf("%s", codiceviaggio);
  290. pviaggio = RicercaViaggio(*lis, codiceviaggio); // cerco un viaggio con il codice fornito
  291. if (pviaggio != NULL) {
  292. SvuotaCoda(&(pviaggio->info.codaprenotazioni));
  293. printf("Coda prenotazioni svuotata\n");
  294. CancellaElementoLista(lis, codiceviaggio);
  295. printf("Viaggio cancellato dalla lista\n");
  296. }
  297. else
  298. printf("Errore: codice viaggio non presente\n");
  299. }
  300.  
  301. int Menu() {
  302. int scelta;
  303.  
  304. printf("***** MENU' DI SCELTA ******\n");
  305. printf("3 - Caricamento lista da file\n");
  306. printf("4 - Visualizzazione intera struttura dati\n");
  307. printf("5 - Inserimento nuovo viaggio in lista\n");
  308. printf("6 - Inserimento nuova prenotazione in coda\n");
  309. printf("7 - Visualizzazione prima prenotazione in coda (e successiva cancellazione)\n");
  310. printf("8 - Cancellazione viaggio (e svuotamento relativa coda prenotazioni)\n");
  311. printf("0 - Fine programma\n");
  312.  
  313. printf("\nInserisci una scelta ----> ");
  314. scanf("%d", &scelta);
  315.  
  316. return scelta;
  317. }
  318.  
  319. int main(void) {
  320. TipoLista listaviaggi=NULL;
  321. int scelta, n;
  322. char nomefile[] = "viaggi.txt";
  323.  
  324. do {
  325. scelta = Menu();
  326.  
  327. switch (scelta) {
  328. case 3:
  329. n = CaricaLista(nomefile, &listaviaggi);
  330. printf("Sono stati caricati %d viaggi\n", n);
  331. break;
  332.  
  333. case 4:
  334. VisualizzaListaViaggi(listaviaggi);
  335. break;
  336.  
  337. case 5:
  338. InserimentoNuovoViaggio(&listaviaggi);
  339. break;
  340. case 6:
  341. InserisciNuovaPrenotazione(listaviaggi);
  342. break;
  343.  
  344. case 7:
  345. VisualizzaEliminaPrenotazione(listaviaggi);
  346. break;
  347.  
  348. case 8:
  349. EliminaViaggio(&listaviaggi);
  350. break;
  351. }
  352.  
  353. } while (scelta != 0);
  354.  
  355. return 0;
  356. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement