Advertisement
darkjessy94

Grafo con Matrici di adiacenza

Sep 12th, 2017
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.36 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #define NumNodi 5
  5.  
  6. struct lista
  7. {
  8. int val;
  9. struct lista *next;
  10. };
  11. typedef struct lista Lista;
  12. typedef Lista *TipoPila;
  13.  
  14. struct coda
  15. {
  16. struct lista *primo;
  17. struct lista *ultimo;
  18. };
  19. typedef struct coda TipoCoda;
  20.  
  21. typedef int TipoNodo;
  22. typedef TipoNodo TipoElemPila;
  23. typedef TipoNodo TipoElemCoda;
  24.  
  25. struct Grafo
  26. {
  27. bool matr_adiacenza[NumNodi][NumNodi];
  28. };
  29. typedef struct Grafo *TipoGrafo;
  30.  
  31. TipoGrafo InitGrafo()
  32. {
  33. TipoNodo i,j;
  34. TipoGrafo grafo;
  35.  
  36. grafo = malloc(sizeof(struct Grafo));
  37.  
  38. for(i = 0; i < NumNodi ; i++)
  39. for(j = 0 ; j < NumNodi ; j++)
  40. grafo->matr_adiacenza[i][j]=false;
  41. return grafo;
  42. }
  43.  
  44. TipoGrafo DistruggeGrafo(TipoGrafo grafo)
  45. {
  46. free(grafo);
  47. return NULL;
  48. }
  49.  
  50. TipoGrafo SvuotaGrafo(TipoGrafo grafo)
  51. {
  52. TipoNodo i, j;
  53.  
  54. for(i = 0; i < NumNodi ; i++)
  55. for(j = 0 ; j < NumNodi ; j++)
  56. grafo->matr_adiacenza[i][j]=false;
  57. return grafo;
  58. }
  59.  
  60. bool TestEsisteArco(TipoGrafo grafo, TipoNodo i, TipoNodo j)
  61. {
  62. return grafo->matr_adiacenza[i][j];
  63. }
  64.  
  65. TipoGrafo InserArco(TipoGrafo grafo, TipoNodo i, TipoNodo j)
  66. {
  67. grafo->matr_adiacenza[i][j] = true;
  68. return grafo;
  69. }
  70.  
  71. TipoGrafo ElimArco(TipoGrafo grafo, TipoNodo i, TipoNodo j)
  72. {
  73. grafo->matr_adiacenza[i][j]=false;
  74. return grafo;
  75. }
  76.  
  77. void StampaGrafo(TipoGrafo grafo)
  78. {
  79. TipoNodo i,j;
  80.  
  81. for(i=0;i<NumNodi;i++)
  82. {
  83. printf("%2d: ",i);
  84. for(j=0;j<NumNodi;j++)
  85. {
  86. if(TestEsisteArco(grafo,i,j))
  87. printf(" -> %d",j);
  88. }
  89. printf("\n");
  90. }
  91. }
  92.  
  93. bool TestPilaVuota(TipoPila p)
  94. {
  95. if(p==NULL)
  96. return true;
  97. else
  98. return false;
  99. }
  100.  
  101. void Push(TipoPila *p,TipoElemPila v)
  102. {
  103. TipoPila paux;
  104. paux = malloc(sizeof(struct lista));
  105.  
  106. paux->val=v;
  107. paux->next=(*p);
  108. *p=paux;
  109. }
  110. void Pop(TipoPila *p,TipoElemPila* v)
  111. {
  112. TipoPila paux;
  113. if(TestPilaVuota(*p))
  114. printf("ERRORE: PILA VUOTA\n");
  115. else
  116. {
  117. *v = (*p)->val;
  118. paux = *p;
  119. *p = (*p)->next;
  120. free(paux);
  121. }
  122. }
  123.  
  124. void InitPila(TipoPila *p,TipoElemPila v)
  125. {
  126. *p = malloc(sizeof(struct lista));
  127.  
  128. (*p)->val=v;
  129. (*p)->next=NULL;
  130. }
  131.  
  132. void Analizza(TipoNodo i)
  133. {
  134. printf("%d ",i);
  135. }
  136. void VisitaInProfondita(TipoGrafo grafo, TipoNodo nodo_iniz)
  137. {
  138. TipoNodo i,j;
  139. TipoPila pila;
  140. bool nodi_visti[NumNodi];
  141.  
  142. for(i=0;i<NumNodi;i++)
  143. nodi_visti[i] = false;
  144.  
  145. InitPila(&pila,nodo_iniz);
  146.  
  147. while(!TestPilaVuota(pila))
  148. {
  149. Pop(&pila,&i);
  150. if(!nodi_visti[i])
  151. {
  152. Analizza(i);
  153. nodi_visti[i] = true;
  154.  
  155. for(j=NumNodi-1; j>=0; j--)
  156. if(TestEsisteArco(grafo,i,j)&& !nodi_visti[j])
  157. Push(&pila,j);
  158. }
  159. }
  160. }
  161.  
  162. void InitCoda(TipoCoda *coda)
  163. {
  164. coda->primo=NULL;
  165. coda->ultimo=NULL;
  166. }
  167. bool TestCodaVuota(TipoCoda coda)
  168. {
  169. if(coda.primo==NULL)
  170. return true;
  171. else
  172. return false;
  173. }
  174.  
  175. void InCoda(TipoCoda *coda, TipoElemCoda v)
  176. {
  177. if(TestCodaVuota(*coda))
  178. {
  179. coda->primo = malloc(sizeof(struct lista));
  180. coda->ultimo = coda->primo;
  181. }
  182. else
  183. {
  184. coda->ultimo->next = malloc(sizeof(struct lista));
  185. coda->ultimo=coda->ultimo->next;
  186. }
  187. coda->ultimo->val = v;
  188. coda->ultimo->next = NULL;
  189. }
  190. void OutCoda(TipoCoda *coda, TipoElemCoda *v)
  191. {
  192. Lista* paux;
  193.  
  194. if(TestCodaVuota(*coda))
  195. printf("ERRORE: CODA VUOTA\n");
  196. else
  197. {
  198. *v = coda->primo->val;
  199. paux = coda->primo;
  200. coda->primo = coda->primo->next;
  201. free(paux);
  202. if(coda->primo==NULL)
  203. coda->ultimo = NULL;
  204. }
  205.  
  206. }
  207. void VisitaInAmpiezza(TipoGrafo grafo, TipoNodo nodo_iniz)
  208. {
  209. TipoNodo i, j;
  210. TipoCoda coda;
  211. bool nodi_visti[NumNodi];
  212. for(i = 0; i < NumNodi;i++)
  213. nodi_visti[i] = false;
  214. InitCoda(&coda);
  215. InCoda(&coda,nodo_iniz);
  216. while(!TestCodaVuota(coda))
  217. { ///prendi il prossimo nodo i da visitare
  218. OutCoda(&coda,&i);
  219. ///analizza il nodo i e lo pone tra i nodi visti
  220. if(!nodi_visti[i])
  221. {
  222. Analizza(i);
  223. nodi_visti[i] = true;
  224.  
  225. for( j=0; j < NumNodi; j++)
  226. if(TestEsisteArco(grafo,i,j)&& !nodi_visti[j])
  227. InCoda(&coda,j);
  228. }
  229. }
  230. }
  231.  
  232.  
  233. int main()
  234. {
  235. TipoGrafo grafo;
  236. TipoNodo i,j;
  237. char flag;
  238. grafo = InitGrafo();
  239.  
  240. while(flag!='n'){
  241. printf("Dimmi quali vertici vuoi collegare\n");
  242. printf("Inserisci vertice da: ");scanf("%d",&i);
  243. printf("Inserisci vertice a: ");scanf("%d",&j);
  244. printf("\n");
  245. grafo=InserArco(grafo,i,j);
  246. printf("Vuoi continuare? s/n: ");fflush(stdin);scanf("%c",&flag);
  247. }
  248.  
  249. StampaGrafo(grafo);
  250.  
  251. VisitaInProfondita(grafo,0);
  252. printf("\n");
  253. VisitaInAmpiezza(grafo,0);
  254.  
  255. return 0;
  256. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement