ZZ 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. // esercizzio_liste.cpp : Defines the entry point for the console application.
  2. //
  3. /*
  4. fare un programma che permette l inserimento ordinato degli elementi di una lista la visualizzazione e il cancella ovvero che permette di cancellare
  5. un nodo dato in input il nodo da ricercare tutto questo in un menu
  6. */
  7. #include "stdafx.h"
  8. #include <iostream>
  9. #define LEN 20
  10. typedef struct {
  11. char nome[LEN + 1];
  12. char cognome[LEN + 1];
  13. int età;
  14. }DATI;
  15. typedef struct NODO {
  16. DATI dati;
  17. NODO*next;
  18. }NODO;
  19. bool lista_vuota(NODO*n);
  20. NODO*alloca();
  21. void inserisci(NODO*n);
  22. NODO*ultimo_(NODO*n);
  23. void leggi(NODO*n);
  24. void visualizza(NODO*n);
  25. void trova(NODO*n);
  26. void menù();
  27. void dealloc(NODO*n);
  28. int main()
  29. {
  30. menù();
  31. return 0;
  32. }
  33. void menù() {
  34. NODO*n=0;
  35. int scelta = 0;
  36. system("cls");
  37. printf("menù\n");
  38. printf("0.esci\n");
  39. printf("1.inserisci\n");
  40. printf("2.visuaizza\n");
  41. printf("3.rimozione elemento\n");
  42. scanf_s("%d", &scelta, sizeof(int));
  43. switch (scelta) {
  44. case 0:
  45. printf("arrivederci e lasciate la mancia\n");
  46. system("pause");
  47. break;
  48. case 1:
  49. inserisci(n);
  50. break;
  51. case 2:
  52. visualizza(n);
  53. system("pause");
  54. break;
  55. case 3:
  56. trova(n);
  57. system("pause");
  58. break;
  59. default:
  60. printf("valore non valido\n");
  61. system("pause");
  62. break;
  63. }
  64. }
  65. bool lista_vuota(NODO*n) {
  66. if (n == NULL) {
  67. return true;// la lista è vuota
  68. }
  69. else
  70. return false; // la lista è piena
  71. }
  72. NODO*alloca() {
  73. NODO*nuovo=NULL;
  74. nuovo = (NODO*)malloc(sizeof(NODO));
  75. if (nuovo == NULL) {
  76. printf("errore!!\n");
  77. return 0;
  78. }
  79. nuovo->next = NULL;
  80. }
  81. void inserisci(NODO*n) {
  82. int scelta = 0;
  83. NODO*ultimo = 0;
  84. NODO*nuovo = 0;
  85. do {
  86. system("cls");
  87. printf("menù\n");
  88. printf("0.esci\n");
  89. printf("1.continua ad aggiungere\n");
  90. scanf_s("%d", &scelta, sizeof(int));
  91. switch (scelta) {
  92. case 0:
  93. printf("arrivederci\n");
  94. break;
  95. case 1:
  96. if (lista_vuota(n) == true) {
  97. nuovo = alloca();
  98. leggi(nuovo);
  99. nuovo->next = ultimo;
  100. }
  101. else {
  102. ultimo = ultimo_(n);
  103. nuovo = alloca();
  104. leggi(nuovo);
  105. nuovo->next = ultimo;
  106. }
  107. break;
  108. default:
  109. printf("valore non valido\n");
  110. break;
  111. }
  112. } while (scelta != 0);
  113. dealloc(n);
  114. }
  115. NODO*ultimo_(NODO*n) {
  116. NODO*p;
  117. p = n;
  118. while (p->next != NULL) {
  119. p = p->next;
  120. }
  121. return p;
  122. }
  123. void leggi(NODO*n) {
  124. printf("inseire cognome\n");
  125. scanf_s("%s", n->dati.cognome, LEN + 1);
  126. printf("inseire nome\n");
  127. scanf_s("%s", n->dati.nome, LEN + 1);
  128. printf("inseire età \n");
  129. scanf_s("%s", n->dati.età, LEN + 1);
  130. }
  131. void visualizza(NODO*n) {
  132. NODO*p;
  133. int cont = 0;
  134. p = n;
  135. while (p != NULL) {
  136. printf(" il nodo è %d\n il cognome è %s\n il nome è %s\n l'età è di %d\n", cont, p->dati.cognome, p->dati.nome, p->dati.età);
  137. p = p->next;
  138. cont++;
  139. }
  140. }
  141. void trova(NODO*n) {
  142. NODO*t = 0;
  143. char ricerca[LEN + 1];
  144. printf("inseire il ocgnome da ricercare\n");
  145. scanf_s("%s", ricerca, LEN + 1);
  146. while (n != NULL) {
  147. if (strcmp(n->dati.cognome, ricerca) == 0) {
  148. t = n;//copio i dati
  149. break;
  150. }
  151. n = n->next;
  152. }
  153. while (n != NULL) {
  154. if (n->next == t) {
  155. n->next = t->next;// coipio il puntatore al interno del puntatore precedente
  156. }
  157. n = n->next;
  158. }
  159. }
  160. void dealloc(NODO*n) {
  161. NODO*p;
  162. if (lista_vuota(n) == true) {
  163. printf("la lista è vuota");
  164. }
  165. else {
  166. while (n != NULL) {
  167. p = n;//metto p uggluale ad n
  168. n = p->next;//faccio puntare il puntatore n al altro elemento cosi ho eliminato l'elemento precedente
  169. free(p);//libero p
  170. p = NULL; //pongo p ugguale a null cosi da poterlo riutilizzare
  171. }
  172. }
  173. }