Guest User

Untitled

a guest
Jan 23rd, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.22 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. typedef struct{
  5.        int nmax;
  6.        int nv;
  7.        int *v_ver;
  8.        int **m_rel;
  9. }Graf_mr;
  10.  
  11. typedef struct nodo
  12. {
  13.         struct nodo *sig;
  14.         int d;
  15. }*pila;
  16. int iniGraf(Graf_mr *g, int nv);
  17. int insVertice(Graf_mr *g, int ver);
  18. int insRelacion(Graf_mr *g, int vf, int vd);
  19. void printGrafo(Graf_mr *g);
  20. int supVer(Graf_mr *g, int vf);
  21. int buscaCamino(Graf_mr *g, int vf, int vd);
  22. /////////
  23. int push(pila *p, int d);
  24. int pop(pila *p, int *d);
  25. int creanodo(pila *p, int d);
  26.  
  27.  
  28.  
  29. int main()
  30. {
  31.     int nv, ver, vf, vd;
  32.     char res;
  33.     Graf_mr g;
  34.     printf("Teclea numero de vertices\n");
  35.     scanf("%d",nv);
  36.     iniGraf(&g,nv);
  37.    
  38.     do{
  39.                    printf("presiona v para insertar vertice\n");
  40.                    printf("presiona r para insertar relacion\n");
  41.                    printf("presiona p para imprimir grafo\n");
  42.                    printf("presiona e para eliminar grafo\n");
  43.                    printf("presiona b para buscar camino\n");
  44.                    getchar();
  45.                    res=getchar();
  46.                    switch(res)
  47.                    {
  48.                               case 'v':
  49.                                    printf("\nteclea el vertice\n");
  50.                                    scanf("%d",ver);
  51.                                    insVertice(&g, ver);
  52.                                    break;
  53.                               case 'r':
  54.                                    printf("\nteclea el vertice fuente\n");
  55.                                    scanf("%d",vf);
  56.                                    printf("\nteclea el vertice destino\n");
  57.                                    scanf("%d",vd);
  58.                                    insRelacion(&g, vf,vd);
  59.                                    break;
  60.                               case 'p':
  61.                                    printGrafo(&g);
  62.                                    break;
  63.                               case 'e':
  64.                                    printf("\nteclea el vertice a eliminar\n");
  65.                                    scanf("%d",ver);
  66.                                    supVer(&g, ver);
  67.                                    break;
  68.                               case 'b':
  69.                                    printf("\nteclea el vertice fuente\n");
  70.                                    scanf("%d",vf);
  71.                                    printf("\nteclea el vertice destino\n");
  72.                                    scanf("%d",vd);
  73.                                    buscaCamino(&g,vf,vd);
  74.                                    break;
  75.                    
  76.                    
  77.                    }
  78.            
  79.    
  80.    
  81.     }while(res!='s');
  82.        
  83.    
  84.     system("pause");
  85.     return 0;
  86. }
  87.  
  88. int iniGraf(Graf_mr *g, int nv)
  89. {
  90.     int b=0, i;
  91.     if(g->v_ver=(int*)malloc(sizeof(int)*nv))
  92.    
  93.     {
  94.                 if(g->m_rel=(int**)malloc(sizeof(int*)*nv))
  95.                 {
  96.                      b=1;
  97.                       for(i=0; i<nv; i++)
  98.                       {
  99.                                if(!(*(g->m_rel+i)=((int*)malloc(sizeof(int)*nv))))
  100.                                {
  101.                                      while(i>=0)
  102.                                            free(*(g->m_rel+i));
  103.                                      free(g->m_rel);
  104.                                      free(g->v_ver);
  105.                                      b=0;
  106.                                                                              
  107.                                }
  108.                       }
  109.                       if(b)
  110.                       {
  111.                              g->nmax=nv;
  112.                              g->nv=0;
  113.                       }                                    
  114.                 }
  115.                 else
  116.                    free(g->v_ver);
  117.                
  118.     }
  119.     return(b);
  120. }
  121.  
  122. int insVertice(Graf_mr *g, int ver)
  123. {
  124.     int b=0,i;
  125.     if(g->nv<g->nmax)
  126.     {
  127.                     *(g->v_ver+g->nv)=ver;
  128.                     for(i=0;i<=g->nv;i++)
  129.                     {
  130.                                          *(*(g->m_rel+g->nv)+i)=0;
  131.                                          *(*(g->m_rel+i)+g->nv)=0;
  132.                     }
  133.                     g->nv++;
  134.                     b=1;
  135.     }
  136.     return b;
  137. }
  138.  
  139. int insRelacion(Graf_mr *g, int vf, int vd)
  140. {
  141.     int b=0, r, c;
  142.     for(r=0;r<g->nv&&*(g->v_ver+r)!=vf;r++);
  143.     if(r<g->nv)
  144.     {
  145.                for(c=0;c<g->nv&&*(g->v_ver+c)!=vd;c++);
  146.                if(c<g->nv)
  147.                {
  148.                           *(*(g->m_rel+r)+c)=1;
  149.                           b=1;
  150.                }
  151.     }
  152.     return b;
  153. }
  154.  
  155. void printGrafo(Graf_mr *g)
  156. {
  157.      int r,c;
  158.      for(r=0;r<g->nv;r++)
  159.      {
  160.                          printf("\n%d = ",*(g->v_ver+r));
  161.                          for(c=0;c<g->nv;c++)
  162.                          {
  163.                                              if(*(g->v_ver+c))
  164.                                                 printf("\t%d ",*(g->v_ver+c));
  165.                          }
  166.      }
  167. }
  168.  
  169. /*int VerFuente(Graf_mr g, )
  170. {
  171.     int r,c, cont=0;
  172.     for(r=0; i<g.nv;r++);
  173.     if()
  174.     {}
  175. }*/
  176.  
  177. int supVer(Graf_mr *g, int vf)
  178. {
  179.     int b=0,r,c,i,j;
  180.     for(r=0;r<g->nv&&*(g->v_ver+r)!=vf;r++);
  181.     if(r<g->nv)
  182.     {
  183.         for(i=r; i<g->nv-1;i++)
  184.              *(g->v_ver+i)=*(g->v_ver+1+i);
  185.        
  186.         for(i=r; i<g->nv-1;i++)
  187.             for(j=r; j<g->nv-1;j++)
  188.                 *(*(g->m_rel+i)+j)=*(*(g->m_rel+1+i)+j);
  189.                 g->nv--;
  190.                 b=1;
  191.     }
  192.     return b;
  193.        
  194.    
  195. }
  196.  
  197. int buscaCamino(Graf_mr *g, int vf, int vd)
  198. {
  199.     int b=0,r,i;
  200.     pila p=NULL;
  201.     for(r=0;r<g->nv&&*(g->v_ver+r)!=vf;r++);
  202.     if(r<g->nv)
  203.     {
  204.              
  205.                push(&p, r);
  206.                while(pop(&p,&r)&&!b)
  207.                     if(*(g->v_ver+r)==vd)
  208.                        b=1;
  209.                     else
  210.                        if(*(g->v_ver+r)>0);
  211.                        {
  212.                            *(g->v_ver+r)=-1;
  213.                            for(i=0;i<g->nv;i++)
  214.                            if(*(*(g->m_rel+r)+i))
  215.                                 push(&p,i);
  216.                                          
  217.                        }
  218.                     for(i=0;i<g->nv;i++)
  219.                          *(g->v_ver+i)=abs(*(g->v_ver+i));
  220.                     while(pop(&p,&i));
  221.        }
  222.        return b;
  223. }
  224. /////////////////////////////
  225. int push(pila *p, int d)
  226. {
  227.     int b;
  228.     pila nu;
  229.     if(!(*p))
  230.        if(creanodo(&nu,d))
  231.        {
  232.                           *p=nu;
  233.                           b=1;
  234.        }
  235.        else
  236.          b=0;
  237.     else
  238.       b=push(&(*p)->sig, d);
  239.      
  240.     return b;
  241.        
  242. }
  243. int pop(pila *p, int *d)
  244. {
  245.     int b;
  246.     if(!*p)
  247.       b=0;
  248.     else
  249.       if((*p)->sig==NULL)
  250.       {
  251.                          free(*p);
  252.                         *p=NULL;
  253.                          b=1;
  254.       }
  255.       else
  256.         b=pop(&(*p)->sig, d);
  257.        
  258.       return b;
  259.          
  260. }
  261. int creanodo(pila *p, int d)
  262. {
  263.         int b=0;
  264.         if((*p=(pila)malloc(sizeof(struct nodo))))
  265.             {
  266.                 b=1;
  267.                 (*p)->sig=NULL;
  268.                 (*p)->d=d;
  269.             }    
  270.         return (b);
  271. }
Add Comment
Please, Sign In to add comment