Como invertir lista sencilla con el uso de nodos

Iniciado por betast, 21 Abril 2019, 18:39 PM

0 Miembros y 2 Visitantes están viendo este tema.

betast

Hola amigos, tengo este codigo donde utilizo un nodo ubicado en la cabecera(cab) y otro al final(fin).
Quiero saber como puedo mostrar de forma inversa los datos ingresados.

CODIGO:

Código (java) [Seleccionar]

package metodos;
import javax.swing.JOptionPane;

public class lista {
    nodo cab;
    nodo fin;
   
    lista(){
        cab = fin = null;
    }
   
    nodo getNodo(int cod){
        nodo p;
        if( cab == null )
            //lista vacia
            return null;
        else{
            //la lista tiene al menos un nodo
            p=cab;
            while(p!=null){
                if(p.codP == cod)
                    return p;
                else
                    p=p.sig;
            }
            return null;
        }
    }
   
    //creamos el metodo get final
    nodo getNodoEnd(int cod){
        nodo p;
        if( fin == null )
            //lista vacia
            return null;
        else{
            //la lista tiene al menos un nodo
            p=fin;
            while(p!=null){
                if(p.codP == cod)
                    return p;
                else
                    p=p.ant;
            }
            return null;
        }
    }   
   
    boolean getVacia(){
        return cab==null?true:false;
    }
   
    int getLonglista(){
        if(getVacia())
            return 0;
        else{
            int con=0;
            nodo p=cab;
            while(p!=null){
                con++;
                p=p.sig;
            }
            return con;
        }
    }
   
    void setAddFinal(nodo info){
        nodo p, q;
        if( cab == null ){
            cab = info;
            JOptionPane.showMessageDialog(null,
            "Primer elemento agregado!!, la lista tiene 1 elemento.");
        }else{
            q = getNodo(info.codP);
            if(q!=null)
                JOptionPane.showMessageDialog(null,
                "El código del producto ya esta registrado en la lista!!!");
            else{
                p=cab;
                while(p.sig!=null){
                    p=p.sig;
                }
                p.sig = info;
                int tam = getLonglista();
                JOptionPane.showMessageDialog(null,
                "Nuevo elemento agregado al final de la lista,"+
                " existen: "+tam+" elementos.");
            }
        }
    }
   
    void getMostrarT(){
        if(getVacia())
            JOptionPane.showMessageDialog(null, "Lista vacia!!");
        else{
            nodo p=cab;
            String aux="";
            int con=0;
            while(p!=null){
                aux = "La información en la posición "+con+" es:\n";
                aux += "Código Producto: "+p.codP+"\n";
                aux += "Nombre Producto: "+p.nomP+"\n";
                aux += "Precio Unitario: "+p.precioU+"\n";
                JOptionPane.showMessageDialog(null, aux);
                con++;
                p=p.sig;
            }
        }
    }
   
    void setElimN( int cod ){
        nodo p = getNodo(cod);
        if( cab == null ){
            JOptionPane.showMessageDialog(null,
            "Lista vacía...");
        }else{
            if(p==null){
                JOptionPane.showMessageDialog(null, "Elemento no existe!");
            }else{
                nodo q = null;
                if((cab.sig==null)&&( p == cab )){
                    cab = p = null;
                    JOptionPane.showMessageDialog(null,
                    "Elemento eliminado.  Lista vacia!!!");
                }
                else if((cab.sig != null)&&(p == cab)){
                    cab = p.sig;
                    p.sig = null;
                    p = null;
                    JOptionPane.showMessageDialog(null,
                    "Elemento eliminado.  Eliminado en la cabecera!!!");
                }
                else if( (p.sig != null)&&(p!=cab) ){
                    q = cab;
                    while( q.sig != p )
                        q = q.sig;
                    q.sig = p.sig;
                    p.sig = null;
                    p = null;
                    JOptionPane.showMessageDialog(null,
                    "Elemento eliminado!!!");
                }
                else{
                    q = cab;
                    while( q.sig != p )
                        q = q.sig;
                    q.sig = null;
                    p = null;
                    JOptionPane.showMessageDialog(null,
                    "Elemento eliminado de la ultima posicion!!!");
                }
            }
        }
    }
}


Clase nodo:
Código (java) [Seleccionar]

package metodos;

/**
*
* @author Ruben
*/
public class nodo {
    int codP;
    String nomP;
    float precioU;
    nodo sig;
    nodo ant;

    public nodo(int codP, String nomP, float precioU) {
        this.codP = codP;
        this.nomP = nomP;
        this.precioU = precioU;
        this.sig = null;
        this.ant=null;
    }
   
}



Probador:
Código (java) [Seleccionar]

package metodos;
import javax.swing.JOptionPane;

public class probador {
   
    public static void main(String args[]){
        int op, cod;
        String nomp;
        float precio;
        lista productos = new lista();
        nodo aux=null;
        do{
            op=Integer.parseInt(JOptionPane.showInputDialog(
            "Menu Principal \n"+
            "1. Agregar Producto \n"+
            "2. Mostrar Productos \n"+
            "3. Eliminar Producto \n"+
            "4. Eliminar elemento de una posicion \n"+       
            "5. Eliminar elemntos repetidos \n"+
            "6. Invertir lista \n"+
            "7. Rotar elementos \n"+       
            "8. Salir \n"+
            "Entre su opción: "       
            ));
           
            switch(op){
                case 1:
                    cod = Integer.parseInt(JOptionPane.showInputDialog(
                    "Entre código del producto: "));
                    nomp = JOptionPane.showInputDialog("Entre nombre producto: ");
                    precio = Float.parseFloat(JOptionPane.showInputDialog(
                    "Entre precio unitario: "));
                    aux = new nodo(cod,nomp,precio);
                    productos.setAddFinal(aux);
                break;
                case 2:
                    productos.getMostrarT();
                break;
                case 3:
                    cod = Integer.parseInt(JOptionPane.showInputDialog(
                    "Entre código del producto: "));
                    productos.setElimN(cod);
                break;
                case 4:
                    cod = Integer.parseInt(JOptionPane.showInputDialog(
                    "Ingrese elemento a borrar: "));
                    productos.setElimN(cod);
                break;
                case 5:
                   
                break;
                case 6:
                break;
                case 7:
                   
                break;
                case 8:
                    JOptionPane.showMessageDialog(null, "Adios!");
                break;   
                default:
                    JOptionPane.showMessageDialog(null, "Opcion invalida!");
            }
           
        }while(op!=8);
        System.exit(0);
    }
   
}

Serapis

Te ubicas en el nodo final y recorres la lista hacia atrás. Acaba cuando llegas a la raíz (o un null, si no usas raíz).


funcion RecorrerHaciaAtras
    actual = lista.ultimonodo

    hacer mientras actual <> raiz  // nulo
        mostrar actual.dato
        actual = actual.anterior
    repetir
fin funcion

betast

Amigo NEBIRE no te entendi, soy nuevo con ese tema

Cita de: NEBIRE en 22 Abril 2019, 00:19 AM
Te ubicas en el nodo final y recorres la lista hacia atrás. Acaba cuando llegas a la raíz (o un null, si no usas raíz).


funcion RecorrerHaciaAtras
    actual = lista.ultimonodo

    hacer mientras actual <> raiz  // nulo
        mostrar actual.dato
        actual = actual.anterior
    repetir
fin funcion


CalgaryCorpus

Tu clase Nodo incluye un puntero hacia el Nodo anterior.
Usalos ubicandote primero al final de la lista, que tambien has establecido en tus clases.

Aqui mi perfil en LinkedIn, invitame un cafe aqui