Guest User

Untitled

a guest
Jan 6th, 2016
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.63 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct list{
  4. int info;
  5. struct list* next;
  6. } lista;
  7. typedef lista* plista;
  8.  
  9. /*Funzione che calcola la lunghezza di una lista*/
  10. int lungLista(plista p) {
  11. int lung=0;
  12. while (p!=NULL) {
  13. lung++;
  14. p = p->next;
  15. }
  16. return lung;
  17. }
  18.  
  19. /*Funzione che stampa i valori contenuti nei campo info di una lista */
  20. void stampaLista(plista p) {
  21. printf("( ");
  22. plista t = p;
  23. if (t==NULL)
  24. printf("La lista è vuota.\n");
  25. while (t!=NULL) {
  26. printf("[");
  27. printf("%d", t->info);
  28. printf("] ");
  29. t = t->next;
  30. }
  31. printf(")\n");
  32. }
  33.  
  34. /*Funzione che crea una lista di n elementi da input*/
  35. plista creaLista () {
  36. int n, i; //n memorizza il numero degli elementi della lista , i è una variabile indice
  37. plista temp, p; //p è il puntatore al primo nodo della lista, temp è un puntatore ausiliario per scorrerla
  38. printf("Specificare il numero di elementi della lista\n");
  39. scanf("%d",&n);
  40. if(n==0)
  41. p = NULL; //creazione di una lista vuota
  42. else {
  43. p = (plista) malloc(sizeof(lista));
  44. printf("Inserisci il primo valore: \n");
  45. scanf("%d", &p->info); //ho creato il primo nodo della lista, puntato da p
  46. temp = p; //temp punta al primo nodo come p
  47. //ora inserisco gli altri elementi della lista
  48. for (i=2; i<=n; i++) {
  49. temp->next = (plista) malloc(sizeof(lista)); //il nodo puntato da temp punta a un nuovo nodo vuoto
  50. temp = temp-> next; //temp punta al nuovo nodo vuoto
  51. printf("Inserisci il %d elemento della lista\n", i);
  52. scanf("%d", &temp->info); //assegno il valore al nuovo nodo creato
  53. }
  54. temp->next=NULL; //marco la fine della lista
  55. }
  56. return p; //Ritorno il puntatore al primo nodo
  57. }
  58.  
  59. /*Funzione che cancella da una lista L i nodi con valore x */
  60. void cancellaDaLista(plista *s, int x) {
  61. plista prec, corr;
  62. while ((*s)->info == x) //elimino tutti i primi nodi adiacenti che hanno valore x, finché non ne incontro uno con valore diverso da x
  63. if((*s)->next)
  64. (*s) = (*s)->next;
  65. prec = (*s);
  66. corr = (*s)->next;
  67. while(corr->next) { //scorro la lista fino all'ultimo nodo escluso
  68. if (corr->info==x) { //elimino il nodo
  69. corr = corr->next;
  70. prec->next = corr;
  71. }
  72. else { //scalo di 1 in avanti prec e corr
  73. prec = prec->next;
  74. corr = corr->next;
  75. }
  76. }
  77. if (corr->info==x) //analizzo l'ultimo nodo della lista
  78. prec->next=NULL;
  79. }
  80.  
  81. /*Funzione che conta, in una lista, quanti nodi hanno valore x*/
  82. int conta(plista z, int x) {
  83. int cont=0;
  84. while (z->next) {
  85. if (z->info == x)
  86. cont++;
  87. z=z->next;
  88. }
  89. //Controllo l'ultimo nodo
  90. if(z->info==x)
  91. cont ++;
  92. return cont;
  93. }
  94.  
  95. //ERRORE: se ho più di un nodo y (entrambi NON in ultima posizione) mi mette il nodo x solo dopo il primo
  96. /*Funzione che inserisce in L un nodo con valore x dopo un nodo esistente
  97. in L con valore y (se non esiste alcun nodo con valore y, il nodo con valore x va inserito in coda*/
  98. void inserisciXdopoY(plista p, int x, int y) {
  99. plista prec = p;
  100. plista corr = p->next;
  101. if (conta(prec,y)==0) { //inserisco il nodo x in coda
  102. while(corr->next) {
  103. prec = prec->next;
  104. corr = corr-> next;
  105. }
  106. corr = (plista) malloc(sizeof(lista));
  107. corr->info=x;
  108. prec=prec->next;
  109. prec->next=corr;
  110. corr->next=NULL;
  111. }
  112. else {
  113. while (corr->next) {
  114. if (prec->info==y) {
  115. corr = (plista) malloc(sizeof(lista));
  116. corr->info=x;
  117. corr->next = prec->next;
  118. prec->next = corr;
  119. prec=prec->next;
  120. corr=corr->next;
  121. }
  122. else {
  123. prec=prec->next;
  124. corr=corr->next;
  125. }
  126. }
  127. //Controllo dell'ultimo nodo
  128. if(corr->info==y) {
  129. corr = (plista) malloc(sizeof(lista));
  130. corr->info=x;
  131. prec=prec->next;
  132. prec->next=corr;
  133. corr->next=NULL;
  134. }
  135. }
  136. }
  137.  
  138.  
  139.  
  140. int main()
  141. {
  142. plista p;
  143. plista *ps;
  144. p = creaLista(); //p ora punta al primo nodo della lista creata
  145. ps = &p;
  146. stampaLista(p);
  147. printf("Nella lista ci sono %d elementi.\n", lungLista(p));
  148. cancellaDaLista(ps, 4);
  149. stampaLista(p);
  150. printf("Nella lista ci sono %d elementi di valore 3\n", conta(p,3));
  151. inserisciXdopoY(p,0,10);
  152. stampaLista(p);
  153. return 0;
  154. }
Advertisement
Add Comment
Please, Sign In to add comment