NECESITO UNA COLA CIRCULAR

IVAN
29 de Octubre del 2005
HALGUIEN QUE ME PUEDA MANDAR UN PROGRAMA DE COLA CIRCULAR QUE REALIZE:
1 INSERTAR
2 ELIMINAR
3. SALIR

SE LO AGRADESERIA MUCHO PERO MUCHO, GRACIAS.
MI CORRES ES: [email protected]

max
29 de Octubre del 2005
Espero que te sea de ayuda el codigo que por aquí te envio dado que por x razones no puedo entrar al correo para enviarte el programa completo, estas son la funciones principales, trate de argumentarlas lo mejor posible, ha no logre entender la funsion de salir, trata de esplicarte mejor:


class Nodo
{
int dato;
Nodo*siguiente;
public:
Nodo(int adato)
{
dato=adato;
siguiente=NULL;
}
int getdato(){return dato;}
Nodo*getsiguiente(){return siguiente;}

void setdato(int adato){dato=adato;}
void setsiguiente(Nodo*nodo){siguiente=nodo;}
};



class COLACirl
{
Nodo*cabeza;
Nodo*ultimo;
public:
COLACirl()
{
cabeza=NULL;
ultimo=NULL;
}

void adicionar(int dato)
{
Nodo*nodo=new Nodo(dato); //creas un nodo con el dato que se almacenara en la cola

if(cabeza==NULL) //compruebas si la cola esta vacia
{
cabeza=nodo; //adicionas el primer dato de la cola, o sea el primer integrante

}

else if(cabeza!=NULL && ultimo==NULL) // ya existe el primer elemento de la cola por lo que si adiconamos otro tendremos el ultimo hasta que aparesca otro elemento
{
ultimo=nodo;
ultimo->setsiguiente(cabeza);
cabeza->setsiguiente(ultimo);
}
else //continuamos adicionando elementos a la cola que iran siendo el ultimo respectivamente
{
Nodo*cursor=cabeza;
while(cursor!=ultimo)
{
cursor=cursor->getsiguiente();
}
ultimo=nodo;
cursor->setsiguiente(ultimo);
ultimo->setsiguiente(cabeza);

}


}

int Longitud() // devuelve la cantidad de elemento que existe en la cola
{
Nodo*cursor; int lon=1;
cursor=cabeza;
while(cursor!=ultimo)
{
cursor=cursor->getsiguiente();
lon++;
}
return lon;

}


void eliminar(int pos)
{
if(0<pos && pos <=Longitud())
{
if(pos==1) //eliminamos en la primera posicion
{
cabeza=cabeza->getsiguiente();// cabeza sera su siguiente
ultimo->setsiguiente(cabeza); //actualizamos el siguiente del ultimo
}
else if(pos==Longitud()) //eliminamos en la ultima pos
{
Nodo*cursor=cabeza;
while(cursor->getsiguiente()!=ultimo) //recorremos la cola hasta el penultimo elemenento
{
cursor=cursor->getsiguiente();
}
cursor->setsiguiente(cabeza); /* el penultimo elemento es el que sera el ultimo elemento de la cola */
ultimo->setsiguiente(NULL);
delete [] ultimo; // destruimos el ultimo
ultimo=cursor; //actualizamos el ultimo de la cola
}

else
{ /*eliminas en una posicion x situandote en la posicion anterior
salvas el elemento sobre el que estas situado asi como el elemento que se encuentra
siguiente al elemento a eliminar, eliminas y le pasas al apuntador siguiente del nodo salvado
en la posicion anterior el nodo salvado en la posicion porterior al nodo eliminado
*/
int paso=1;
Nodo*cursor=cabeza;
pos=pos-1;
while(paso!=pos)
{
cursor=cursor->getsiguiente();
paso++;
}
Nodo*salva=cursor; // salvo
cursor=cursor->getsiguiente(); //me paro en la pos en la deseo eliminar
Nodo*aux=cursor->getsiguiente();// salvo
cursor->setsiguiente(NULL);
delete [] cursor; // elimino
salva->setsiguiente(aux); // actualizo el siguiente del nodo salvado antes ee la pos de eliminar
}
}
}


void insertar(int pos,int adato)
{
if( 0<pos && pos <= Longitud())
{
Nodo*nodo=new Nodo(adato);
if(pos==1) // insertas en la primeras posicion
{
Nodo*salva=cabeza; // salvas el nodo cabeza
cabeza=nodo; // le asignas el nuevo nodo
ultimo->setsiguiente(cabeza);// actualizas el siguiente del ultimo
cabeza->setsiguiente(salva); // actualizas el siguinte de cabeza
}
else if(pos== Longitud()) // en la ultima
{
Nodo*cursor=cabeza;

while(cursor->getsiguiente()!=ultimo)
{
cursor=cursor->getsiguiente();
}
/*
te situas en el penultimo nodo hace apuntar el siguiente del penultimo al nuevo nodo
y al nuevo nodo lo haces apuntar el siguiente al ultimo

*/
nodo->setsiguiente(ultimo);
cursor->setsiguiente(nodo);
}

else // insertas en una pos x
{
Nodo*cursor=cabeza;
int paso=1;
pos=pos-1;
while(paso!=pos)
{
cursor=cursor->getsiguiente();
paso++;
}
/*
te situas en la pos anterior a la de insertar
salvas el elemnto de esa pos
te mueves hacia el nodo de la pos
haces apuntar el siguiente del nodo salvado al nuevo nodo
y haces apuntar al el siguiente del nuevo nodo al nodo que anteriormente se hallaba en esa pos
*/
Nodo*salva=cursor;
cursor=cursor->getsiguiente();
salva->setsiguiente(nodo);
nodo->setsiguiente(cursor);
}
}
}
};