Advertisement
darkjessy94

Untitled

Sep 6th, 2017
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.99 KB | None | 0 0
  1. /*
  2. ESERCIZIO 51 [LIV. 1]
  3. Scrivere una function C per la costruzione di un grafo non orientato mediante matrice di
  4. adiacenze: in input per ogni nodo sono specificati quelli adiacenti. Scegliendo in input un
  5. nodo, scrivere una function C che restituisca il suo grado.
  6. */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10.  
  11. #define size 100
  12.  
  13. void costruisci_grafo(int [][size],int);
  14. void stampa_matrice_adiacenze(int [][size], int);
  15. int grado_nodo(int [][size], int, int);
  16.  
  17. void main ()
  18. {
  19. int matrice_adiacenze[size][size];
  20. int i, j, n, risp, nodo;
  21.  
  22. printf("Inserire numero vertici del grafo: "); scanf("%d",&n);
  23.  
  24. /*stampa vertici*/
  25. printf("\nVertici: ");
  26. for (i=0; i<n; i++)
  27. printf("%d ",i);
  28.  
  29. printf("\n\n");
  30.  
  31. /*inizializzazione matrice*/
  32. for (i=0; i<n; i++)
  33. for (j=0; j<n; j++)
  34. matrice_adiacenze[i][j] = 0;
  35.  
  36. /*chiamata alle function*/
  37. costruisci_grafo(matrice_adiacenze, n);
  38. stampa_matrice_adiacenze(matrice_adiacenze, n);
  39.  
  40. risp=0;
  41. while (risp==0)
  42. {
  43. printf("\nInserire nodo di cui si vuole conoscere il grado (-1 per terminare): ");
  44. scanf("%d",&nodo);
  45.  
  46. if ((nodo!=-1) && (nodo<n)) //se non si e' inserito il tasto di uscita e il nodo esiste
  47. /*richiama la function che calcola il grado di un nodo dato in input*/
  48. printf("Il grado del nodo %d e': %d",nodo,grado_nodo(matrice_adiacenze,n,nodo));
  49. else /*altrimenti*/
  50. if (nodo == -1)
  51. risp=1; //se si e' inserito il tasto di uscita aggiorna la variabile di uscita
  52. else
  53. printf("\n\nNodo inserito non esistente nel grafo!\n\n");
  54. }
  55. }
  56.  
  57. /*Function che costruisce il grafo */
  58. void costruisci_grafo(int matrice_adiacenze[size][size], int num_nodi)
  59. {
  60. int i, j, adiacenze=-2;
  61.  
  62. for (i=0; i<num_nodi; i++) /*per i che va da 0 a quanti sono i nodi*/
  63. {
  64. printf("\nInserire i nodi adiacenti al vertice %d",i);
  65. printf("(premere -1 per terminare l'inserimento):\n");
  66.  
  67. //il numero di nodi adiacenti e' al massimo uguale al numero di nodi presenti nel grafo
  68. for (j=0; j<num_nodi; j++)
  69. {
  70. while (adiacenze == -2) /*mentre adiacenze = -2*/
  71. {
  72. scanf("%d",&adiacenze); /*leggi il nodo adiacente*/
  73.  
  74. /*se il nodo adiacente inserito non esiste*/
  75. if (adiacenze>num_nodi-1 || adiacenze < -1)
  76. {
  77. printf("Nodo inesistente!");
  78. printf("\nReinserire: ");
  79. adiacenze=-2;
  80. /*reimposta adiacenze al valore -2 per soddisfare la condizione del while*/
  81. }
  82. }
  83.  
  84. /*se si e' inserito -1 termina l'inserimento dei nodi adiacenti per il nodo i-esimo*/
  85. if (adiacenze == -1)
  86. {
  87. adiacenze=-2; /*reimposta il valore di adiacenze*/
  88. break;
  89. }
  90. else
  91. {
  92. /*dovrebbero essere modificate la riga e la colonna perche stiamo trattando di
  93. un grafo non orientato e quindi la matrice che andremo a costruire e' una
  94. matrice simmetrica cioe il triangolo superiore e' simmetrico rispetto al
  95. triangolo inferiore. Sapendo che essa e' simmetrica, si puo dimezzarne
  96. l'occupazione di memoria rappresentando solo il triangolo super. o infer. */
  97.  
  98. /*inserisce nella matrice (alla riga i-sima (corrispondente al nodo di cui si
  99. stanno inserendo le adiacenze), colonna uguale al nodo con cui e' adiacente)
  100. un 1*/
  101. matrice_adiacenze[i][adiacenze] = 1;
  102. }
  103. adiacenze=-2;/*reimposta il valore di adiacenze*/
  104. }
  105. printf("\n");
  106. }
  107. }
  108.  
  109. /*Function che stampa la matrice di adiacenze */
  110. void stampa_matrice_adiacenze(int matrice_adiacenze[size][size], int num_nodi)
  111. {
  112. int i, j;
  113.  
  114. printf("\n\n");
  115. printf("Matrice di adiacenze del grafo non orientato creato:\n\n");
  116.  
  117. printf("Vertici: ");
  118. for(i=0; i<num_nodi; i++)
  119. printf("%d ",i);
  120. for(i=0; i<num_nodi; i++)
  121. {
  122. printf("\n\t%d| ",i);
  123. for(j=0;j<num_nodi;j++)
  124. printf("%d ",matrice_adiacenze[i][j]);
  125. }
  126. printf("\n\n");
  127. }
  128.  
  129. /*Function che sceglie in input un nodo e restituisce il suo grado (numero di archi) */
  130. int grado_nodo(int matrice_adiacenze[size][size], int num_nodi, int nodo)
  131. {
  132. int i=0, grado=0;
  133.  
  134. /*il numero di confronti e' pari al numero dei nodi (la matrice e' nxn)*/
  135. while (i<num_nodi) /*mentre la riga che si sta scorrendo non e' terminata*/
  136. {
  137. /*se la componente nodo i-sima della matrice presenta un 1 (la riga corrisponde al
  138. nodo di cui vogliamo l'informazione) */
  139.  
  140. if (matrice_adiacenze[nodo][i]==1)
  141. grado++; /*incrementa il contatore dei gradi*/
  142.  
  143. i++; /*incrementa il contatore che scorre la riga*/
  144. }
  145. return grado; /*ritorna il grado del nodo*/
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement