Ver Mensaje Individual
  #8 (permalink)  
Antiguo 28/06/2016, 12:33
dehm
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 2 meses
Puntos: 10
Respuesta: Como declarar un tipo

Grafo.h (continuación):
Código C++:
Ver original
  1. //************************************//
  2. //copiar un nodo existente a otro nodo//
  3. //************************************//
  4.  
  5. template <typename datonodo_t, typename datoarista_t>
  6. void Grafo<datonodo_t,datoarista_t>::CopiarNodo(pNodo& padre, pNodo& hijo, pArista& precedente, pArista& NuevaArista)
  7. {
  8.     if (padre)
  9.         {
  10.             //eliminamos la posibilidad de tener dos nodos iguales bajo el mismo padre
  11.             if (esReferenciaCircular(padre,hijo))
  12.                 {
  13.                     std::cout<<"Referencia circular"<<std::endl;
  14.                 }
  15.             else
  16.                 {
  17.                     InsertarHijo(padre,hijo, precedente, NuevaArista);
  18.                 }
  19.         }
  20.     else std::cout<<"No hay padre al que copiar!!!"<<std::endl;
  21. }
  22.  
  23. //**********************************************************************//
  24. //recorre sólamente los nodos hijos directos que penden de un nodo padre//
  25. //**********************************************************************//
  26.  
  27. template <typename datonodo_t, typename datoarista_t>
  28. void Grafo<datonodo_t,datoarista_t>::recorrerHijos(const pNodo& padre, TratarArista& tratamiento)
  29. {
  30.     if (padre->adyacente!=0)
  31.         {
  32.             pArista A=padre->adyacente;
  33.             while (A->siguiente!=0)
  34.                 {
  35.                     tratamiento(A);
  36.                     A=A->siguiente;
  37.                 }
  38.             tratamiento(A);
  39.         }
  40. }
  41.  
  42. //*************************************//
  43. //recorrer el arbol a partir de un nodo//
  44. //*************************************//
  45.  
  46. template <typename datonodo_t, typename datoarista_t>
  47. void Grafo<datonodo_t,datoarista_t>::recorrerGrafo(pNodo& inicio, TratarArista& tratamiento)
  48. {
  49.     pArista A;
  50.     if (inicio)
  51.         {
  52.             guardaAristas (inicio);//meto las aristas en la pila
  53.             while (!pila.empty())
  54.                 {
  55.                     A=pila.top();
  56.                     pila.pop();
  57.                     pila.pop();
  58.                     tratamiento(A);
  59.                     recorrerGrafo(A->destino,tratamiento);
  60.                 }
  61.         }
  62. }
  63.  
  64.  
  65. //****************************************************************************//
  66. //recorrer el arbol a partir de un nodo con informacion del nivel de cada nodo//
  67. //****************************************************************************//
  68.  
  69. template <typename datonodo_t, typename datoarista_t>
  70. void Grafo<datonodo_t,datoarista_t>::recorrerGrafoConNiveles(pNodo& inicio, TratarAristaConNiveles& tratamiento, int n)
  71. {
  72.     pArista A;
  73.     if (inicio)
  74.         {
  75.             guardaAristasNivel(inicio,n);
  76.             while (!pilaniveles.empty())
  77.                 {
  78.                     A=pilaniveles.top().first;
  79.                     n=pilaniveles.top().second+1;
  80.                     pilaniveles.pop();
  81.                     std::pair<pArista,int>prov;
  82.                     prov.first=A;
  83.                     prov.second=n;
  84.                     tratamiento(prov);
  85.                     recorrerGrafoConNiveles(A->destino,tratamiento,n);
  86.                 }
  87.         }
  88. }
  89.  
  90. //***************************************************//
  91. //busca todos los ancestros de un nodo dado          //
  92. //***************************************************//
  93.  
  94. template <typename datonodo_t, typename datoarista_t>
  95. void Grafo<datonodo_t,datoarista_t>::recorrerAncestros(pNodo& n,TratarNodo& tratamiento)
  96. {
  97.     std::list<pNodo>listanodos;
  98.     typename std::list<pNodo>::iterator it;
  99.     pNodo indice=Raiz;
  100.  
  101.     while (indice)
  102.         {
  103.             if (indice->adyacente)
  104.                 {
  105.                     pArista A=indice->adyacente;
  106.                     while (A)
  107.                         {
  108.                             if (A->destino==n)
  109.                                 {
  110.                                     listanodos.push_back(indice);
  111.                                     tratamiento(indice);
  112.                                     //std::cout<<"El nodo "<<indice->datonodo.LeeCodigo()<<" es padre de "<<A->destino->datonodo.LeeCodigo()<<std::endl;
  113.                                     break;
  114.                                 }
  115.                             else
  116.                                 {
  117.                                     A=A->siguiente;
  118.                                 }
  119.                         }
  120.                 }
  121.             indice=indice->siguiente;
  122.         }
  123.  
  124.     for (it=listanodos.begin(); it!=listanodos.end(); ++it)
  125.         {
  126.             if (*it!=Raiz)
  127.                 {
  128.                     recorrerAncestros(*it, tratamiento);
  129.                 }
  130.         }
  131. }
  132.  
  133. //*********************************//
  134. //muestra todos los nodos del grafo//
  135. //*********************************//
  136.  
  137. template <typename datonodo_t, typename datoarista_t>
  138. void Grafo<datonodo_t,datoarista_t>::recorrerNodos(TratarNodo& tratamiento)
  139. {
  140.     pNodo indice=Raiz;
  141.     while (indice!=0)
  142.         {
  143.             tratamiento(indice);
  144.             indice=indice->siguiente;
  145.         }
  146. }
  147.  
  148. //*********************************************************************//
  149. //busca si un nodo que quiero copiar como hijo de otro es padre de éste//
  150. //necesario para evitar referencias circulares                         //
  151. //*********************************************************************//
  152.  
  153. template <typename datonodo_t, typename datoarista_t>
  154. bool Grafo<datonodo_t,datoarista_t>::esReferenciaCircular(pNodo& padre, pNodo& hijo)
  155. {
  156.     if (padre==hijo)
  157.         {
  158.             std::cout<<"Referencia $$ circular"<<std::endl;
  159.             return true;
  160.         }
  161.     else
  162.         {
  163.             pArista A;
  164.             bool encontrado=false;
  165.             guardaAristas(hijo);
  166.             while (!pila.empty())
  167.                 {
  168.                     A=pila.top();
  169.                     pila.pop();
  170.                     if (A->destino==padre)
  171.                         {
  172.                             //vacio la pila
  173.                             while (!pila.empty())
  174.                                 pila.pop();
  175.                             std::cout<<"Referencia circular"<<std::endl;
  176.                             return true;
  177.                         }
  178.                     return encontrado || esReferenciaCircular(padre,A->destino);
  179.                 }
  180.         }
  181.     return false;
  182. }
__________________
Mi calculadora en Qt