Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. UNIT uGrafo;
  2.  
  3. INTERFACE
  4.     USES uElem,uCola,uConjunto,uPila;
  5.  
  6.     TYPE
  7.  
  8.         TListaDestinos = ^TNodoD;
  9.  
  10.         TNodoD = RECORD
  11.             sig:TListaDestinos;
  12.             info:TElem;
  13.         END;
  14.  
  15.         TGrafo = ^TNodoO;
  16.  
  17.         TNodoO = RECORD
  18.             ady:TListaDestinos;
  19.             sig:TGrafo;
  20.             info:TElem;
  21.         END;
  22.  
  23.  
  24.         PROCEDURE CrearGrafoVacio(VAR grafo:TGrafo);
  25.  
  26.         PROCEDURE InsertarVertice(VAR grafo:TGrafo; e:TElem);
  27.  
  28.         PROCEDURE EliminarVertice(VAR grafo:TGrafo; e:TElem);
  29.  
  30.         PROCEDURE InsertarArco (VAR grafo:TGrafo; vO,vD:TElem);
  31.  
  32.         PROCEDURE EliminarArco(VAR grafo:TGrafo; vO,vD:TElem);
  33.  
  34.         FUNCTION EsGrafoVacio (grafo:TGrafo):boolean;
  35.  
  36.         PROCEDURE Pertenece (grafo:TGrafo; e:TElem; VAR b:boolean; VAR pos:TGrafo);
  37.  
  38.         FUNCTION PerteneceAdy (listaAdy:TListaDestinos; e:TElem):boolean;
  39.  
  40.         PROCEDURE BorrarListaAdy (VAR listaAdy:TListaDestinos);
  41.  
  42.         PROCEDURE MostrarAnchura (grafo:TGrafo);
  43.  
  44.         PROCEDURE BorrarGrafo (VAR grafo:TGrafo);
  45.  
  46.  
  47. IMPLEMENTATION
  48.  
  49.         PROCEDURE CrearGrafoVacio(VAR grafo:TGrafo);
  50.             BEGIN
  51.                 grafo := NIL;
  52.             END;{CrearGrafoVacio}
  53.  
  54.         PROCEDURE InsertarVertice(VAR grafo:TGrafo; e:TElem);
  55.             VAR
  56.                 buleano:boolean;
  57.                 pos,aux:TGrafo;
  58.             BEGIN
  59.                 CrearGrafoVacio(pos);
  60.                 Pertenece(grafo,e,buleano,pos);
  61.  
  62.                 IF buleano=FALSE THEN
  63.                     BEGIN
  64.                         new(aux);
  65.                         Asignar(aux^.info , e);
  66.                         aux^.sig := grafo;
  67.                         aux^.ady := NIL;
  68.                         grafo := aux;
  69.                     END;{IF}
  70.  
  71.             END;{InsertarVertice}
  72.  
  73.         PROCEDURE EliminarVertice(VAR grafo:TGrafo; e:TElem);
  74.             VAR
  75.                 aux,act,ant,pos:TGrafo;
  76.                 b:boolean;
  77.             BEGIN
  78.                 ant := NIL;
  79.                 act := grafo;
  80.  
  81.                 b := FALSE;
  82.  
  83.                 pos := NIL;
  84.  
  85.  
  86.                 Pertenece(grafo, e, b,pos);
  87.  
  88.  
  89.                 WHILE act<>NIL DO
  90.                     BEGIN
  91.                         EliminarArco(grafo, act^.info, e);
  92.  
  93.                         IF act<>NIL THEN
  94.                             IF Iguales(act^.info , e) THEN
  95.                                 BEGIN
  96.                                     BorrarListaAdy(act^.ady);
  97.                                     IF ant=NIL THEN
  98.                                         BEGIN
  99.                                             aux := grafo;
  100.                                             grafo := grafo^.sig;
  101.                                             dispose(aux);
  102.  
  103.                                             act := grafo;
  104.                                         END{IF}
  105.                                     ELSE
  106.                                         BEGIN
  107.                                             ant^.sig := act^.sig;
  108.                                             dispose(act);
  109.  
  110.                                             act := ant^.sig;
  111.  
  112.                                         END{ELSE}
  113.                                 END {IF}
  114.  
  115.                             ELSE
  116.                                 BEGIN
  117.                                     ant := act;
  118.                                     act := act^.sig;
  119.                                 END;{ELSE}
  120.  
  121.                     END;{WHILE}
  122.  
  123.             END;{EliminarVertice}
  124.  
  125.         PROCEDURE InsertarArco (VAR grafo:TGrafo; vO,vD:TElem);
  126.             VAR
  127.                 b1,b2:boolean;
  128.                 pos1,pos2:TGrafo;
  129.                 aux:TListaDestinos;
  130.             BEGIN
  131.  
  132.                 b1 := FALSE;
  133.                 b2 := FALSE;
  134.  
  135.                 pos1 := NIL;
  136.                 pos2 := NIL;
  137.  
  138.                 Pertenece(grafo,vO,b1,pos1);
  139.                 Pertenece(grafo,vD,b2,pos2);
  140.  
  141.                 IF b1 AND b2 THEN
  142.                     IF NOT( PerteneceAdy(pos1^.ady , vD) ) THEN
  143.                         BEGIN
  144.                             new(aux);
  145.                             Asignar(aux^.info , vD);
  146.                             aux^.sig := pos1^.ady;
  147.                             pos1^.ady := aux;
  148.                         END;{IF}
  149.             END;{InsertarArco}
  150.  
  151.         PROCEDURE EliminarArco(VAR grafo:TGrafo; vO,vD:TElem);
  152.             VAR
  153.                 b:boolean;
  154.                 pos:TGrafo;
  155.                 ant,act,aux : TListaDestinos;
  156.             BEGIN
  157.                 pos := NIL;
  158.                 b := FALSE;
  159.  
  160.                 Pertenece(grafo,vO,b,pos);
  161.  
  162.                 IF b THEN
  163.                     BEGIN
  164.                         ant := NIL;
  165.                         act := pos^.ady;
  166.  
  167.                         WHILE (act<>NIL) AND NOT(Iguales(act^.info , vD)) DO
  168.                             BEGIN
  169.                                 ant := act;
  170.                                 act := act^.sig;
  171.                             END;{WHILE}
  172.  
  173.                         IF act<>NIL THEN
  174.                             IF ant=NIL THEN
  175.                                 BEGIN
  176.                                     aux := pos^.ady;
  177.                                     pos^.ady := pos^.ady^.sig;
  178.                                     dispose(aux);
  179.  
  180.                                 END{IF}
  181.                             ELSE
  182.                                 BEGIN
  183.                                     ant^.sig := act^.sig;
  184.                                     dispose(act);
  185.                                 END;{ELSE}
  186.  
  187.                     END;{IF}
  188.  
  189.  
  190.             END;{EliminarArco}
  191.  
  192.         FUNCTION EsGrafoVacio (grafo:TGrafo):boolean;
  193.             BEGIN
  194.                 EsGrafoVacio := (grafo = NIL);
  195.             END;{EsGrafoVacio}
  196.  
  197.         PROCEDURE Pertenece (grafo:TGrafo; e:TElem; VAR b:boolean; VAR pos:TGrafo);
  198.             BEGIN
  199.                 WHILE (grafo<>NIL) AND (b=FALSE) DO
  200.                     BEGIN
  201.                         b := Iguales(grafo^.info , e);
  202.                         grafo := grafo^.sig;
  203.                     END;{WHILE}
  204.  
  205.                 pos := grafo;
  206.  
  207.             END;{Pertenece}
  208.  
  209.         FUNCTION PerteneceAdy (listaAdy:TListaDestinos; e:TElem):boolean;
  210.             VAR
  211.                 check:boolean;
  212.             BEGIN
  213.                 check := FALSE;
  214.  
  215.                 WHILE (listaAdy<>NIL) AND (check=FALSE) DO
  216.                     BEGIN
  217.                         check := Iguales(listaAdy^.info , e);
  218.                         listaAdy := listaAdy^.sig;
  219.                     END;{WHILE}
  220.  
  221.                 PerteneceAdy := check;
  222.  
  223.             END;{Pertenece}
  224.  
  225.         PROCEDURE BorrarListaAdy (VAR listaAdy:TListaDestinos);
  226.             VAR
  227.                 aux:TListaDestinos;
  228.             BEGIN
  229.                 WHILE listaAdy<>NIL DO
  230.                     BEGIN
  231.                         aux := listaAdy;
  232.                         listaAdy := listaAdy^.sig;
  233.                         dispose(aux);
  234.                     END;{WHILE}
  235.  
  236.             END;{BorrarListaAdy}
  237.  
  238.         PROCEDURE MostrarAnchura (grafo:TGrafo);
  239.             VAR
  240.                 conjR,conjV,conjD:TConjunto;
  241.                 cola:TCola;
  242.                 aux,pos:TGrafo;
  243.                 e:TElem;
  244.                 aux2:TListaDestinos;
  245.                 b:boolean;
  246.             BEGIN
  247.                 IF grafo<>NIL THEN
  248.                     BEGIN
  249.                         CrearConjuntoVacio(conjR);
  250.                         CrearConjuntoVacio(conjV);
  251.                         CrearConjuntoVacio(conjD);
  252.                         CrearGrafoVacio(pos);
  253.  
  254.                         CrearColaVacia(cola);
  255.                         aux := grafo;
  256.  
  257.                         WHILE aux<>NIL DO
  258.                             BEGIN
  259.                                 Poner(conjV , aux^.info);
  260.                                 aux := aux^.sig;
  261.                             END;{WHILE}
  262.  
  263.  
  264.                         Asignar(e , grafo^.info);
  265.                         Mostrar(e);
  266.                         Poner(conjR , e);
  267.  
  268.                         aux2 := grafo^.ady;
  269.  
  270.                         WHILE aux2<>NIL DO
  271.                             BEGIN
  272.                                 InsertarCola(cola , aux2^.info);
  273.                                 aux2 := aux2^.sig;
  274.                             END;{WHILE}
  275.  
  276.                         WHILE NOT(EsColaVacia(cola)) DO
  277.                             BEGIN
  278.                                 Cabecera(cola , e);
  279.                                 Mostrar(e);
  280.                                 Poner(conjR , e);
  281.  
  282.                                 pos := NIL;
  283.  
  284.                                 Pertenece(grafo,e,b,pos);
  285.  
  286.                                 WHILE (pos^.ady<>NIL) DO
  287.                                     BEGIN
  288.                                         IF NOT(uConjunto.Pertenece(conjR , pos^.ady^.info)) THEN
  289.                                             InsertarCola(cola , pos^.ady^.info);
  290.                                         pos^.ady := pos^.ady^.sig;
  291.  
  292.                                     END;{WHILE}
  293.  
  294.                                 uCola.Eliminar(cola);
  295.  
  296.                             END;{WHILE}
  297.  
  298.                         Diferencia(conjV , conjR , conjD);
  299.  
  300.                         WHILE NOT(EsConjuntoVacio(conjD)) DO
  301.                             BEGIN
  302.                                 Asignar(e , conjD^.info);
  303.  
  304.                                 Mostrar(e);
  305.  
  306.                                 Poner(conjR , e);
  307.  
  308.                                 pos := NIL;
  309.  
  310.                                 b := FALSE;
  311.  
  312.                                 Pertenece(grafo,e,b,pos);
  313.  
  314.                                 WHILE pos^.ady<>NIL DO
  315.                                     BEGIN
  316.                                         IF NOT(uConjunto.Pertenece(conjR , pos^.ady^.info)) THEN
  317.                                             InsertarCola(cola , pos^.ady^.info);
  318.  
  319.                                         pos^.ady := pos^.ady^.sig;
  320.                                     END;{WHILE}
  321.  
  322.                                 WHILE NOT(EsColaVacia(cola)) DO
  323.                                     BEGIN
  324.                                         Cabecera(cola , e);
  325.                                         Mostrar(e);
  326.                                         Poner(conjR,e);
  327.  
  328.                                         pos := NIL;
  329.  
  330.                                         b := FALSE;
  331.  
  332.                                         Pertenece(grafo,e,b,pos);
  333.  
  334.                                         WHILE pos^.ady<>NIL DO
  335.                                             BEGIN
  336.                                                 IF NOT(uConjunto.Pertenece(conjR,pos^.ady^.info)) THEN
  337.                                                     InsertarCola(cola , pos^.ady^.info);
  338.                                                 pos^.ady := pos^.ady^.sig;
  339.  
  340.                                             END;{WHILE}
  341.  
  342.                                         uCola.Eliminar(cola);
  343.  
  344.  
  345.                                     END;{WHILE}
  346.  
  347.                                 EliminarConjunto(conjD);
  348.                                 Diferencia(conjV, conjR , conjD);
  349.                             END;{WHILE}
  350.  
  351.  
  352.                     END;{IF}
  353.  
  354.             END;{MostrarAnchura}
  355.  
  356.  
  357.         PROCEDURE BorrarGrafo (VAR grafo:TGrafo);
  358.             VAR
  359.                 aux:TGrafo;
  360.  
  361.             BEGIN
  362.                 WHILE (grafo<>NIL) DO
  363.                     BEGIN
  364.                         aux := grafo;
  365.                         grafo := grafo^.sig;
  366.                         dispose(aux);
  367.                     END;
  368.  
  369.             END;
  370.  
  371.  
  372.  
  373.  
  374. END.