//*************************************************************//
//comprueba la existencia de un nodo igual al que quiero copiar//
//necesario para evitar tener dos nodos iguales colgando del //
//mismo padre //
//*************************************************************//
template <typename datonodo_t, typename datoarista_t>
bool Grafo<datonodo_t,datoarista_t>::existeHermano (pNodo& padre, pNodo& hijo)
{
pArista A=padre->adyacente;
while (A!=0)
{
//std::cout<<"posicionada la arista"<<A<<std::endl;
if (A->destino==hijo)
{
return true;
}
A=A->siguiente;
}
//std::cout<<"No hay gemelos"<<std::endl;
return false;
}
//*********************************************//
//comprueba la presencia de un nodo en la lista//
//para evitar su inclusión por duplicado //
//*********************************************//
template <typename datonodo_t, typename datoarista_t>
bool Grafo<datonodo_t,datoarista_t>::existeNodo (const pNodo& n)
{
pNodo indice=Raiz;
if (n==indice)
return true;
else
{
while (indice->siguiente)
{
indice=indice->siguiente;
if (n==indice)
{
return true;
}
}
}
return false;
}
//***************************************************//
//guarda las aristas que penden de un nodo en la pila//
//***************************************************//
template <typename datonodo_t, typename datoarista_t>
void Grafo<datonodo_t,datoarista_t>::guardaAristas (pNodo& n)
{
pArista A;
if (n && n->adyacente) //si hay aristas
{
A=n->adyacente;
//me posiciono en la última arista
while (A->siguiente!=0)
{
A=A->siguiente;
}
//empiezo el recorrido hacia atrás
while (A->anterior!=0)
{
pila.push (A); //meto la arista en la pila
A=A->anterior;
}
pila.push (A); //meto la primera arista en la pila*/
}
}
//**************************************************************//
//guarda las aristas y el nivel que penden de un nodo en la pila//
//**************************************************************//
template <typename datonodo_t, typename datoarista_t>
void Grafo<datonodo_t,datoarista_t>::guardaAristasNivel (pNodo& n, int nivel)
{
pArista A;
std::pair<pArista,int> pareja;
pareja.second=nivel;
if (n && n->adyacente) //si hay aristas
{
A=n->adyacente;
//me posiciono en la última arista
while (A->siguiente!=0)
{
A=A->siguiente;
}
//empiezo el recorrido hacia atrás
while (A->anterior!=0)
{
pareja.first=A;
pilaniveles.push (pareja); //meto la arista en la pila
A=A->anterior;
}
pareja.first=A;
pilaniveles.push (pareja); //meto la arista en la pila
}
}
template <typename DATON, typename DATOA>
nodo<DATON,DATOA>* Grafo<DATON,DATOA>::posicionarseEnNodo(datonodo_t dato)
{
pNodo indice=Raiz;
while (indice->siguiente!=0 && indice->datonodo!=dato)
{
indice=indice->siguiente;
}
if (indice->datonodo!=dato)
{
//std::cout<<"Nodo inválido"<<std::endl;
return 0;
}
else return indice;
}
//*******************************//
//obtiene el nivel del nodo padre//
//** ****************************//
template <typename DATON, typename DATOA>
int Grafo<DATON,DATOA>::NivelNodoPadre(pNodo& padre) const
{
pNodo indice=Raiz;
pArista A;
while (indice)
{
if (indice->adyacente)
{
A=indice->adyacente;
while (A)
{
if (A->destino==padre)
{
return A->nivel;
}
A=A->siguiente;
}
}
indice=indice->siguiente;
}
return -1; //en caso de error o de que no haya encotnrado el nodo padre.....
}
#endif // GRAFO_H