Advertisement
Guest User

Untitled

a guest
Jun 29th, 2016
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.35 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #define MAX_VERTICI 15
  5.  
  6. typedef struct Nodo* nodo_pointer;
  7.  
  8. typedef struct Nodo{
  9. int valore;
  10. nodo_pointer link;
  11. }Nodo;
  12.  
  13. nodo_pointer grafo[MAX_VERTICI];
  14. nodo_pointer testa_coda=NULL;
  15. nodo_pointer fine_coda=NULL;
  16. _Bool marcato[MAX_VERTICI];
  17.  
  18. nodo_pointer inserisci(nodo_pointer, int, int);
  19. void visualizza_lista_adiacenza(nodo_pointer);
  20. void visualizzaGrafo(int);
  21. void addC(int);
  22. int eliminaC();
  23. _Bool CodaEmpty();
  24. void visita_in_ampiezza(int);
  25. void ampiezza(int);
  26. void visita_in_Profondita(int);
  27. void cancella_lato(int, int);
  28. void componenti_connesse(int);
  29.  
  30. int main()
  31. {
  32. int n, i;
  33. int scelta, opzione;
  34. int vertice_di_partenza, v1, v2;
  35.  
  36. printf("\n\t*** Implementazione struttura dati grafo ***\n\n\n");
  37. printf("\nQuanti nodi vuoi inserire?");
  38. scanf("%d", &n);
  39.  
  40. for(i=0; i<n; i++){
  41.  
  42. printf("\nNodo %d. Ha nodi adiacenti?(1 si, 0 no)", i);
  43. scanf("%d", &scelta);
  44. if(scelta==1)
  45. grafo[i]=inserisci(grafo[i], i, n);
  46. }
  47. printf("\nGrafo creato!!\n\n");
  48. do{
  49. printf("\nScegli un'opzione:\n\n");
  50. printf("\t1) Visualizza grafo e liste di adiacenza\n");
  51. printf("\t2) Visita in ampiezza\n");
  52. printf("\t3) Visita in profondita'\n");
  53. printf("\t4) Cancella lato\n");
  54. printf("\t5) Componenti connesse\n");
  55. printf("\t6) Esci\n\n");
  56. scanf("%d", &opzione);
  57.  
  58.  
  59. switch(opzione){
  60. case 1:
  61. visualizzaGrafo(n);
  62. break;
  63. case 2:
  64. printf("\nInserisci il vertice dal quale vuoi iniziare la visita: ");
  65. scanf("%d", &vertice_di_partenza);
  66. printf("\nSequenza vertici raggiungibili da %d in ampiezza:\n", vertice_di_partenza);
  67. visita_in_ampiezza(vertice_di_partenza);
  68. break;
  69. case 3:
  70. for(i=0;i<MAX_VERTICI;i++)
  71. marcato[i]=false;
  72. printf("\nInserisci il vertice dal quale vuoi iniziare la visita: ");
  73. scanf("%d", &vertice_di_partenza);
  74. printf("\nSequenza vertici raggiungibili da %d in profondita':\n", vertice_di_partenza);
  75. visita_in_Profondita(vertice_di_partenza);
  76. break;
  77. case 4:
  78. printf("\nInserisci i due vertici del lato da eliminare: ");
  79. scanf("%d %d", &v1,&v2);
  80. cancella_lato(v1, v2);
  81. printf("\nLato eliminato! Vuoi stampare il grafo per verifica?(1 si, 0 no)");
  82. scanf("%d", &scelta);
  83. if(scelta==1)
  84. visualizzaGrafo(n);
  85. break;
  86. case 5:
  87. componenti_connesse(n);
  88. break;
  89. case 6:
  90. return 0;
  91.  
  92.  
  93.  
  94. }
  95.  
  96. }while(opzione!=6);
  97.  
  98.  
  99. return 0;
  100. }
  101.  
  102. nodo_pointer inserisci(nodo_pointer lista_adiacenza, int i, int nVertici){
  103.  
  104. int scelta, numero;
  105.  
  106. nodo_pointer temp= NULL;
  107. nodo_pointer fine_lista=NULL;
  108.  
  109.  
  110. do{
  111. do{
  112. printf("\nInserire nodo adiacente:");
  113. scanf("%d", &numero);
  114. if(numero==i)
  115. printf("Il nodo non puo' essere adiacente a se' stesso.\n");
  116. if(numero<0 || numero>nVertici-1)
  117. printf("Il nodo adiacente deve essere compreso tra 0 e %d", nVertici-1);
  118. }while(numero==i || numero<0 || numero>nVertici-1);
  119.  
  120.  
  121. temp=(nodo_pointer)malloc(sizeof(Nodo));
  122. temp->valore=numero;
  123. temp->link=NULL;
  124.  
  125. if(lista_adiacenza==NULL){
  126. lista_adiacenza=temp;
  127. fine_lista=temp;
  128. }
  129. else{
  130. fine_lista->link=temp;
  131. fine_lista=fine_lista->link;
  132. }
  133.  
  134. printf("\nVuoi inserire un'altro nodo adiacente?(1 si, 0 no)");
  135. scanf("%d", &scelta);
  136.  
  137. }while(scelta!=0);
  138.  
  139. return lista_adiacenza;
  140.  
  141. }
  142.  
  143. void visualizza_lista_adiacenza(nodo_pointer lista){
  144. if(lista!=NULL){
  145. printf("%d\t", lista->valore);
  146. visualizza_lista_adiacenza(lista->link);
  147. }
  148. }
  149.  
  150. void visualizzaGrafo(int n){
  151. int i;
  152. printf("\n\n\tVisualizzazione grafo e liste di adiacenza:\n\n");
  153. for(i=0;i<n;i++){
  154. printf("\nNodo %d.", i);
  155. printf("\nRelativi nodi adiacenti:\t");
  156. visualizza_lista_adiacenza(grafo[i]);
  157. }
  158. }
  159.  
  160.  
  161. //Esercizio 10_2
  162.  
  163. void addC(int item){
  164.  
  165. nodo_pointer tmp=(nodo_pointer)malloc(sizeof(Nodo));
  166.  
  167. tmp->valore=item;
  168. tmp->link=NULL;
  169.  
  170. if(CodaEmpty()){
  171. testa_coda=tmp;
  172. fine_coda=tmp;
  173. }
  174. else{
  175. fine_coda->link=tmp;
  176. fine_coda=fine_coda->link;
  177. }
  178. }
  179.  
  180. int eliminaC(){
  181.  
  182. if(CodaEmpty())
  183. return -1;
  184. nodo_pointer tmp=testa_coda;
  185. testa_coda=testa_coda->link;
  186.  
  187. return tmp->valore;
  188.  
  189. }
  190.  
  191. _Bool CodaEmpty(){
  192.  
  193. if(testa_coda==NULL)
  194. return true;
  195. else
  196. return false;
  197. }
  198.  
  199. void visita_in_ampiezza(int vIniziale){
  200.  
  201. int i=0;
  202.  
  203. for(i=0;i<MAX_VERTICI;i++)
  204. marcato[i]=false;
  205.  
  206. ampiezza(vIniziale);
  207. }
  208.  
  209. void ampiezza(int vertice){
  210.  
  211. nodo_pointer w;
  212. int el_delete;
  213. marcato[vertice]=true;
  214. printf("%d \t", vertice);
  215. addC(vertice);
  216.  
  217. while(CodaEmpty()==false){
  218. el_delete=eliminaC();
  219.  
  220. for(w=grafo[el_delete]; w!=NULL; w=w->link){
  221.  
  222. if(marcato[w->valore]==false){
  223. printf("%d\t", w->valore);
  224. marcato[w->valore]=true;
  225. addC(w->valore);
  226. }
  227. }
  228. }
  229. }
  230.  
  231. void visita_in_Profondita(int vIniziale){
  232.  
  233. nodo_pointer nodo=NULL;
  234. nodo=(nodo_pointer)malloc(sizeof(Nodo));
  235. nodo->valore=vIniziale;
  236.  
  237. printf("%d\t", nodo->valore);
  238. marcato[nodo->valore]=true;
  239.  
  240. for(nodo=grafo[nodo->valore];nodo!=NULL;nodo=nodo->link){
  241. if(marcato[nodo->valore]==false)
  242. visita_in_Profondita(nodo->valore);
  243. }
  244. }
  245.  
  246. void cancella_lato(int vertice1,int vertice2){
  247.  
  248. nodo_pointer tmp=NULL;
  249. nodo_pointer prec=NULL;
  250.  
  251. for(tmp=grafo[vertice1];tmp!=NULL;tmp=tmp->link){
  252.  
  253. if(tmp->valore==vertice2){
  254.  
  255. if(prec==NULL){
  256. grafo[vertice1]=tmp->link;
  257. }
  258. else
  259. {
  260. prec->link=tmp->link;
  261. free(tmp);
  262. break;
  263. }
  264.  
  265. }
  266. else
  267. prec=tmp;
  268. }
  269.  
  270. prec = NULL;
  271.  
  272. for(tmp=grafo[vertice2];tmp!=NULL;tmp=tmp->link){
  273.  
  274. if(tmp->valore==vertice1){
  275.  
  276. if(prec==NULL){
  277. grafo[vertice2]=tmp->link;
  278. }
  279. else
  280. {
  281. prec->link=tmp->link;
  282. free(tmp);
  283. break;
  284. }
  285.  
  286. }
  287. else
  288. prec=tmp;
  289. }
  290. }
  291.  
  292. void componenti_connesse(int nVertici)
  293. {
  294. int i,cont=1;
  295.  
  296. for(i=0;i<nVertici;i++)
  297. marcato[i]=false;
  298.  
  299. for(i=0;i<nVertici;i++)
  300. {
  301. if(marcato[i]==false)
  302. {
  303. printf("\nComponente connessa %d.\n",cont);
  304. visita_in_Profondita(i);
  305. cont++;
  306. }
  307. }
  308. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement