darkjessy94

Grafo con Liste di adiacenza

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