Cola doblemente enlazada
Publicado por Tram (1 intervención) el 18/01/2007 22:30:05
Hola a todos
tengo este codigo de una Cola doblemente enlazada. Hay algun error pero no soy capaz de verlo, a ver si alguien puede ayudarme...
El problema es:
tengo por ejemplo 3 elementos "A", "B" y "C"
borro el ultimo, "C"
inserto uno nuevo,"D"
Pues al insertar despues de borrar el ultimo, nunca aparece
public class Cola{
protected Nodo cab; //inicio de la Cola
protected Nodo actual; //referencia
protected Nodo fin;
protected int numElem;
public Cola() {
cab = actual = null;
this.numElem = 0;
}
public int getNumElementos() {
return this.numElem;
}
public boolean estaVacia() {
return cab == null;
}
private void insertarEnCabeza(Object o) {
Nodo nuevo = new Nodo(o);
nuevo.sig = cab;
if (cab==null) {
fin = nuevo;
}
cab = nuevo;
this.numElem++;
}
public void insertarAlFinal (Object o) {
if (this.estaVacia()) {
this.insertarEnCabeza(o);
return;
}
// Si el actual es el ultimo, insertar detras de actual
Nodo nuevo = new Nodo (o);
fin.sig = nuevo;
fin = nuevo;
this.numElem++;
}
public void inicio() {
actual = cab;
}
public boolean esFin() {
return actual == null;
}
public void avanzar() {
if (actual != null) {
actual = actual.sig;
}
}
public Object getActual() {
if (actual == null) {
return null;
}
else {
return actual.info;
}
}
public void irAlUltimo() {
this.actual = this.fin;
}
public String toString() {
String t = "";
inicio();
while (!esFin()) {
t += actual.info + "\n";
avanzar();
}
return t;
}
public void recorrer() {
System.out.println(toString());
}
public Object buscar(Object o) {
inicio();
while (!esFin() && !o.equals(getActual())) {
avanzar();
}
if (esFin()) {
return null;
}
else {
return getActual();
}
}
public void borrar(Object o) {
// Esta vacia, no se puede borrar nada, salir
if (estaVacia()) {
return;
}
// Hay un elemento, avanzar cabeza y salir
if (cab.info.equals(o)) {
cab = cab.sig;
this.numElem--;
return;
}
// La Cola no esta vacia, y el que hay que borrar es al menos el segundo
Nodo p = cab;
Nodo q = null;
while (p != null && !p.info.equals(o)) {
q = p;
p = p.sig;
}
if (p != null) {
Nodo r = p.sig;
q.sig = r;
this.numElem--;
}
}
public void borrarActual () {
// Si esta vacia o no hay actual, salir
if (this.estaVacia() || this.esFin()) {
return;
}
if (this.actual==this.cab) {
this.cab = this.cab.sig;
this.actual = this.cab; // mover iterador (para que no quede apuntando al elemento borrado)
this.numElem--;
return;
}
Nodo p = cab;
while (p.sig!=actual) {
p = p.sig;
}
Nodo r = actual.sig;
p.sig = r;
this.actual = r;
this.numElem--;
}
}
tengo este codigo de una Cola doblemente enlazada. Hay algun error pero no soy capaz de verlo, a ver si alguien puede ayudarme...
El problema es:
tengo por ejemplo 3 elementos "A", "B" y "C"
borro el ultimo, "C"
inserto uno nuevo,"D"
Pues al insertar despues de borrar el ultimo, nunca aparece
public class Cola{
protected Nodo cab; //inicio de la Cola
protected Nodo actual; //referencia
protected Nodo fin;
protected int numElem;
public Cola() {
cab = actual = null;
this.numElem = 0;
}
public int getNumElementos() {
return this.numElem;
}
public boolean estaVacia() {
return cab == null;
}
private void insertarEnCabeza(Object o) {
Nodo nuevo = new Nodo(o);
nuevo.sig = cab;
if (cab==null) {
fin = nuevo;
}
cab = nuevo;
this.numElem++;
}
public void insertarAlFinal (Object o) {
if (this.estaVacia()) {
this.insertarEnCabeza(o);
return;
}
// Si el actual es el ultimo, insertar detras de actual
Nodo nuevo = new Nodo (o);
fin.sig = nuevo;
fin = nuevo;
this.numElem++;
}
public void inicio() {
actual = cab;
}
public boolean esFin() {
return actual == null;
}
public void avanzar() {
if (actual != null) {
actual = actual.sig;
}
}
public Object getActual() {
if (actual == null) {
return null;
}
else {
return actual.info;
}
}
public void irAlUltimo() {
this.actual = this.fin;
}
public String toString() {
String t = "";
inicio();
while (!esFin()) {
t += actual.info + "\n";
avanzar();
}
return t;
}
public void recorrer() {
System.out.println(toString());
}
public Object buscar(Object o) {
inicio();
while (!esFin() && !o.equals(getActual())) {
avanzar();
}
if (esFin()) {
return null;
}
else {
return getActual();
}
}
public void borrar(Object o) {
// Esta vacia, no se puede borrar nada, salir
if (estaVacia()) {
return;
}
// Hay un elemento, avanzar cabeza y salir
if (cab.info.equals(o)) {
cab = cab.sig;
this.numElem--;
return;
}
// La Cola no esta vacia, y el que hay que borrar es al menos el segundo
Nodo p = cab;
Nodo q = null;
while (p != null && !p.info.equals(o)) {
q = p;
p = p.sig;
}
if (p != null) {
Nodo r = p.sig;
q.sig = r;
this.numElem--;
}
}
public void borrarActual () {
// Si esta vacia o no hay actual, salir
if (this.estaVacia() || this.esFin()) {
return;
}
if (this.actual==this.cab) {
this.cab = this.cab.sig;
this.actual = this.cab; // mover iterador (para que no quede apuntando al elemento borrado)
this.numElem--;
return;
}
Nodo p = cab;
while (p.sig!=actual) {
p = p.sig;
}
Nodo r = actual.sig;
p.sig = r;
this.actual = r;
this.numElem--;
}
}
Valora esta pregunta


0