Ver Mensaje Individual
  #7 (permalink)  
Antiguo 28/06/2016, 12:31
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. //destructor del grafo//
  3. //********************//
  4. template <typename datonodo_t, typename datoarista_t>
  5. Grafo<datonodo_t,datoarista_t>::~Grafo()
  6. {
  7.     std::cout<<"Iniciamos el destructor"<<std::endl;
  8.     pArista A;
  9.     //meto todas las arista del nodo Raiz en la pila
  10.     guardaAristas(Raiz);
  11.  
  12.     //empiezo a borrar todas las ramas que hay en la pila
  13.     while (!pila.empty())
  14.         {
  15.             A=pila.top();
  16.             pila.pop();
  17.             borrarNodos(A);
  18.         }
  19.     delete Raiz;
  20.     //~listaHojas();
  21.     std::cout<<"Borrada la raiz"<<std::endl;
  22. }
  23.  
  24. //*****************//
  25. //constructor copia//
  26. //*****************//
  27. template <typename datonodo_t, typename datoarista_t>
  28. Grafo<datonodo_t, datoarista_t>::Grafo (const Grafo<datonodo_t, datoarista_t>& G)
  29. {
  30.     std::cout<<"CONSTRUCTOR COPIA"<<std::endl;
  31.     //Raiz
  32.     pNodo indice1=G.Raiz;
  33.     Raiz=new t_nodo (*indice1);
  34.     pNodo indice=Raiz;
  35.     pArista indiceA=indice1->adyacente;
  36.     int i=0;
  37.     while (indice1->siguiente)
  38.         {
  39.             indiceA=indice1->adyacente;
  40.             //std::cout<<"Hasta aqui "<<i+1<<std::endl;
  41.  
  42.             while (indiceA)
  43.                 {
  44.                     pNodo hijo=posicionarseEnNodo(indiceA->destino->datonodo);//creo un nodo con el contenido del nodo origen hijo
  45.                     if (hijo==0)
  46.                         {
  47.                             hijo=new t_nodo(*indiceA->destino);
  48.                         }
  49.                     pArista A= new t_arista(*indiceA);
  50.                     InsertarHijo(indice,hijo,A->anterior,A);
  51.                     indiceA=indiceA->siguiente;
  52.                 }
  53.  
  54.             indice1=indice1->siguiente;
  55.             indice=indice->siguiente;
  56.             i++;
  57.         }
  58.     listaHojas(G.listaHojas);//así o listaHojas=G.listaHojas?
  59.     std::cout<<"Copia terminada"<<std::endl;
  60. }
  61.  
  62. //*************************//
  63. //sobrecarga del operador =//
  64. //*************************//
  65.  
  66. template <typename datonodo_t, typename datoarista_t>
  67. Grafo<datonodo_t, datoarista_t>& Grafo<datonodo_t, datoarista_t>::operator=(const Grafo<datonodo_t, datoarista_t>& G)
  68. {
  69.     if (this!=&G)
  70.         {
  71.             delete Raiz;
  72.             //vacio la pila
  73.             while (!pila.empty())
  74.                 {
  75.                     pila.pop();
  76.                 }
  77.             pNodo indice1=G.Raiz;
  78.             Raiz=new t_nodo (*indice1);
  79.             pNodo indice=Raiz;
  80.             pArista indiceA=indice1->adyacente;
  81.             while (indice1->siguiente)
  82.                 {
  83.                     indiceA=indice1->adyacente;
  84.  
  85.                     while (indiceA)
  86.                         {
  87.                             pNodo hijo=posicionarseEnNodo(indiceA->destino->datonodo);//creo un nodo con el contenido del nodo origen hijo
  88.                             if (hijo==0)
  89.                                 {
  90.                                     hijo=new t_nodo(*indiceA->destino);
  91.                                 }
  92.                             pArista A= new t_arista(*indiceA);
  93.                             InsertarHijo(indice,hijo,A->anterior,A);
  94.                             indiceA=indiceA->siguiente;
  95.                         }
  96.  
  97.                     indice1=indice1->siguiente;
  98.                     indice=indice->siguiente;
  99.                 }
  100.             listaHojas=G.listaHojas;
  101.         }
  102.     return *this;
  103. }
  104.  
  105. //**************//
  106. //añadir un nodo//
  107. //**************//
  108.  
  109. template <typename datonodo_t, typename datoarista_t>
  110. void Grafo<datonodo_t,datoarista_t>::anadirNodo(pNodo& n)
  111. {
  112.     pNodo indice=Raiz;
  113.     //me posiciono al final de la lista
  114.     while (indice && indice->siguiente!=0)
  115.         {
  116.             indice=indice->siguiente;
  117.         }
  118.     indice->siguiente=n;
  119.     nNodos++;
  120. }
  121.  
  122. //****************//
  123. //eliminar un nodo//
  124. //****************//
  125.  
  126. template <typename datonodo_t, typename datoarista_t>
  127. void Grafo<datonodo_t,datoarista_t>::eliminarNodo(pNodo& n)
  128. {
  129.     pNodo anterior=Raiz;
  130.     //avanzo anterior hasta el nodo anterior al que quiero borrar
  131.     while (anterior->siguiente!=n)
  132.         {
  133.             anterior=anterior->siguiente;
  134.         }
  135.     if (anterior==Raiz)//primer elemento
  136.         {
  137.             Raiz->siguiente=n->siguiente;
  138.         }
  139.     else
  140.         {
  141.             anterior->siguiente=n->siguiente;
  142.         }
  143.     delete n;
  144.     nNodos--;
  145. }
  146.  
  147. //*****************//
  148. //añadir una arista//
  149. //*****************//
  150.  
  151. template <typename datonodo_t, typename datoarista_t>
  152. void Grafo<datonodo_t,datoarista_t>::anadirArista (pNodo& NodoOrigen, pNodo& NodoDestino, pArista& precedente, pArista& NuevaArista)
  153. {
  154.     if (!NodoOrigen->adyacente)//primera arista
  155.         {
  156.             NodoOrigen->adyacente=NuevaArista;
  157.             NuevaArista->destino=NodoDestino;
  158.             //std::cout<<"Primera arista"<<std::endl;
  159.         }
  160.     else
  161.         {
  162.             pArista Aux=NodoOrigen->adyacente;
  163.             while (Aux!=precedente && Aux->siguiente)
  164.                 {
  165.                     Aux=Aux->siguiente;
  166.                 }
  167.             NuevaArista->siguiente=Aux->siguiente;
  168.             Aux->siguiente=NuevaArista;
  169.             NuevaArista->destino=NodoDestino;
  170.             NuevaArista->anterior=Aux;
  171.         }
  172. }
  173.  
  174. //*******************//
  175. //eliminar una arista//
  176. //*******************//
  177.  
  178. template <typename datonodo_t, typename datoarista_t>
  179. void Grafo<datonodo_t,datoarista_t>::eliminarArista(pArista& A)
  180. {
  181.     pNodo indice=Raiz;
  182.     //veo si la arista a borrar es la adyacente de algún nodo (primera arista)
  183.     while (indice && indice->adyacente!=A)
  184.         {
  185.             indice=indice->siguiente;
  186.         }
  187.     if (indice)//si finalmente la arista a borrar es adyacente de indice
  188.         {
  189.             //si es arista única
  190.             if (!A->anterior && !A->siguiente)
  191.                 {
  192.                     indice->adyacente=0;
  193.                     listaHojas.remove(indice);
  194.                 }
  195.             else
  196.                 {
  197.                     indice->adyacente=A->siguiente;
  198.                 }
  199.         }
  200.  
  201.     //inicio el borrado propiamente dicho
  202.     if (A->anterior)
  203.         {
  204.             A->anterior->siguiente=A->siguiente;
  205.         }
  206.     if (A->siguiente)
  207.         {
  208.             A->siguiente->anterior=A->anterior;
  209.         }
  210.     delete A;
  211. }
  212.  
  213. //***********************************************//
  214. //borrar todos los nodos que penden de una arista//
  215. //***********************************************//
  216.  
  217. template <typename datonodo_t, typename datoarista_t>
  218. void Grafo<datonodo_t,datoarista_t>::borrarNodos(pArista& A)
  219. {
  220.     pNodo hijo=A->destino;
  221.     //quitar un padre al nodo hijo
  222.     if (hijo->nPadres>0) hijo->nPadres--;
  223.     //si todavía es hijo de algún padre....
  224.     if (hijo->nPadres)
  225.         {
  226.             //...me limito a borrar la arista que une al padre con el hijo
  227.             eliminarArista(A);
  228.         }
  229.     else //si se queda huerfanito
  230.         {
  231.             //si el hijo es hoja no tiene aristas que salgan de él, luego adyacente apunta a 0
  232.             if (!hijo->adyacente)
  233.                 {
  234.                     //me posiciono en la arista a borrar
  235.                     eliminarArista(A);
  236.                     listaHojas.remove(hijo);
  237.                     eliminarNodo(hijo);//lo saco de la lista general de nodos
  238.                 }
  239.             else
  240.                 {
  241.                     guardaAristas(hijo);
  242.                     eliminarArista(A);
  243.                     eliminarNodo(hijo);
  244.                     while (!pila.empty())
  245.                         {
  246.                             A=pila.top();
  247.                             pila.pop();
  248.                             borrarNodos(A);
  249.                         }
  250.                 }
  251.         }
  252. }
  253. //**************************//
  254. //insertar un hijo a un nodo//
  255. //**************************//
  256.  
  257. template <typename datonodo_t, typename datoarista_t>
  258. void Grafo<datonodo_t,datoarista_t>::InsertarHijo(pNodo& padre, pNodo& hijo, pArista& precedente, pArista& NuevaArista)
  259. {
  260.     //primer elemento
  261.     if (Raiz==0)
  262.         {
  263.             Raiz=hijo;
  264.             listaHojas.push_back(Raiz);
  265.             nNodos++;
  266.         }
  267.     else
  268.         {
  269.             if (!existeHermano(padre,hijo))
  270.                 {
  271.                     listaHojas.remove(padre);//el padre deja de ser hijo...para convertirse en padre :-)
  272.                     hijo->nPadres++;//añado un padre
  273.                     //solo añado el nodo si es nuevo
  274.                     if (!existeNodo(hijo))
  275.                         {
  276.                             anadirNodo(hijo);
  277.                             listaHojas.push_back(hijo);
  278.                         }
  279.                     anadirArista(padre, hijo, precedente, NuevaArista);
  280.                 }
  281.             else std::cout<<"2 nodos iguales no pueden tener el mismo padre"<<std::endl;
  282.         }
  283.     /*std::cout<<"Lista de hojas: "<<std::endl;
  284.     for (auto it=listaHojas.begin();it!=listaHojas.end();it++)
  285.     {
  286.         std::cout<<((*it)->datonodo.LeeCodigo())<<" - ";
  287.     }
  288.     std::cout<<std::endl;*/
  289. }
__________________
Mi calculadora en Qt