Lista enlazada circular

Soy novata en esto de java y necesito un poco de ayuda... Ojalá pudieses darme una mano
Estoy implementando una cola con una lista enlazada circular, pero mi método en que, que agrega un nuevo nodo a la lista, parece que estar malo pero no encuentro el error
desde ya gracias
class Nodo{
public Object valor;
public double tiempo;
public Nodo sgte;
public Nodo(Object x, double y, Nodo z){
valor=x; tiempo= y; sgte=z;
}
}
class Queue{
protected Nodo ultimo;
public Queue(){
reset();
}
public void reset(){
ultimo=null;
}
public void enque(Object x, double y)throws QueueFull{
try{
Nodo r, aux;
if(ultimo==null){ //la cola está vacía
r=new Nodo(x,y,ultimo);
r.sgte=r;
}
else{
aux=ultimo.sgte;
r= new Nodo(x,y,aux);
ultimo.sgte=r;
}
ultimo=r;
}catch(OutOfMemoryError e){ throw new QueueFull();}
}
}
class QueueFull extends Exception{}
class QueueEmpty extends Exception{}
1

1 respuesta

Respuesta
1
;)
Otra vez, tu método está bien. En el método main que hice, la salida de ejecutar el método "toString" después de añadir los elementos "1", "2", "3" y "4" (en ese orden) es la cadena:
"1 2 3 4 "
Que es justo lo que tiene que salir :)
¿A qué fallo te refieres?
¿A qué error te refieres? Creo que el código está bien. No encontraba ningún fallo así que creé un método mainpara ejecutar el código, y ordena los elementos de forma circular, y tal y como creo que quieres.
El método:
public static void main (String args[])
{
try
{
Queue q = new Queue ( );
q.enque("1", 10);
q.enque("2", 10);
q.enque("3", 10);
q.enque("4", 10);
System.out.println ( (String) q.ultimo.valor );
System.out.println ( (String) q.ultimo.sgte.valor );
System.out.println ( (String) q.ultimo.sgte.sgte.valor );
System.out.println ( (String) q.ultimo.sgte.sgte.sgte.valor );
System.out.println ( (String) q.ultimo.sgte.sgte.sgte.sgte.valor );
System.out.println ( (String) q.ultimo.sgte.sgte.sgte.sgte.sgte.valor );
}
catch (Exception e){e.printStackTrace();}
}
Añade 4 elementos a la cola, primero el "1", luego el "2", luego el "3", y luego el "4". La salida del método es:
4
1
2
3
4
1
Que como ves, muestra primero el último elemento, luego vuelve al primero, segundo, tercero, cuarto, primero...
Eso es una cola circular :)
¿Cómo quieres ordenarlo? ¿En sentido inverso? Cambia la propiedad "sgte" por una propiedad "prev" y enlazala, en lugar de con el nodo siguiente, con el nodo anterior :) y listo.
No le encuentro otro fallo... Entiendo que el programa no está terminado, y que falta un método para recorrer la cola... además, para hacer el reset yo iría recorriendo y poniendo a NULL cada uno de los nodos, para hacer que el recolector de basura pueda borrarlos (y liberar especio en memoria) pero como digo, eso es funcionalidad extra, el método de añadir elementos es correcto... y muy bueno, por cierto, no creo que seas tan "novata" como dices ;)
Si necesitas cualquier aclaración más, o te surge cualquier otra duda, ya sabes donde localizarme :)
Jbellota muchísimas gracias!
Por fin pude detectar cuál es el problema del asunto, lo que pasa es que me hice un método toString() que entrega los valores de la cola en orden de llegada y ese es el que está fallando... U.U, confié ciegamente en ese método y perdí mucho tiempo, así que de nuevo gracias por aclararme el panorama.
¿Podrías decirme en que falla please?
public String toString(){
String aux="";
if(ultimo==null) return aux;//no hay elementos en la cola
if(ultimo==ultimo.sgte) return (String)ultimo.valor; // un sólo elemento
Nodo r=ultimo.sgte;
while(true){
aux=aux+r.valor+" ";
r=r.sgte;
if(r==ultimo.sgte) break;
}
return aux;
}
También tengo otra consulta... pero te la voy a mandar en otro mensaje para puntearla aparte.
Saludos y gracias de nuevo XD
Disculpa una y mil veces, pareciera que java no quiere conmigo (esto nunca me había pasado)... tienes toda la razón ahora sí que encontré la raíz del problema (mala aplicación de herencia U.U), ya lo he arreglado así que la clase está marchando bien... disculpa por haberte dado la molestia :(, de verdad... para que veas que cuando te dije que era novata hablaba en serio ;)
Muchísimas gracias por todo :)... realmente te pasaste!
Saludos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas