Test Foro de elhacker.net SMF 2.1

Programación => Programación General => Java => Mensaje iniciado por: betast en 21 Abril 2019, 18:39 PM

Título: Como invertir lista sencilla con el uso de nodos
Publicado por: betast en 21 Abril 2019, 18:39 PM
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);
    }
   
}
Título: Re: Como invertir lista sencilla con el uso de nodos
Publicado por: Serapis 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
Título: Re: Como invertir lista sencilla con el uso de nodos
Publicado por: betast en 22 Abril 2019, 01:14 AM
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

Título: Re: Como invertir lista sencilla con el uso de nodos
Publicado por: CalgaryCorpus en 22 Abril 2019, 21:01 PM
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.