Foro de elhacker.net

Programación => 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
  1. package metodos;
  2. import javax.swing.JOptionPane;
  3.  
  4. public class lista {
  5.    nodo cab;
  6.    nodo fin;
  7.  
  8.    lista(){
  9.        cab = fin = null;
  10.    }
  11.  
  12.    nodo getNodo(int cod){
  13.        nodo p;
  14.        if( cab == null )
  15.            //lista vacia
  16.            return null;
  17.        else{
  18.            //la lista tiene al menos un nodo
  19.            p=cab;
  20.            while(p!=null){
  21.                if(p.codP == cod)
  22.                    return p;
  23.                else
  24.                    p=p.sig;
  25.            }
  26.            return null;
  27.        }
  28.    }
  29.  
  30.    //creamos el metodo get final
  31.    nodo getNodoEnd(int cod){
  32.        nodo p;
  33.        if( fin == null )
  34.            //lista vacia
  35.            return null;
  36.        else{
  37.            //la lista tiene al menos un nodo
  38.            p=fin;
  39.            while(p!=null){
  40.                if(p.codP == cod)
  41.                    return p;
  42.                else
  43.                    p=p.ant;
  44.            }
  45.            return null;
  46.        }
  47.    }    
  48.  
  49.    boolean getVacia(){
  50.        return cab==null?true:false;
  51.    }
  52.  
  53.    int getLonglista(){
  54.        if(getVacia())
  55.            return 0;
  56.        else{
  57.            int con=0;
  58.            nodo p=cab;
  59.            while(p!=null){
  60.                con++;
  61.                p=p.sig;
  62.            }
  63.            return con;
  64.        }
  65.    }
  66.  
  67.    void setAddFinal(nodo info){
  68.        nodo p, q;
  69.        if( cab == null ){
  70.            cab = info;
  71.            JOptionPane.showMessageDialog(null,
  72.            "Primer elemento agregado!!, la lista tiene 1 elemento.");
  73.        }else{
  74.            q = getNodo(info.codP);
  75.            if(q!=null)
  76.                JOptionPane.showMessageDialog(null,
  77.                "El código del producto ya esta registrado en la lista!!!");
  78.            else{
  79.                p=cab;
  80.                while(p.sig!=null){
  81.                    p=p.sig;
  82.                }
  83.                p.sig = info;
  84.                int tam = getLonglista();
  85.                JOptionPane.showMessageDialog(null,
  86.                "Nuevo elemento agregado al final de la lista,"+
  87.                " existen: "+tam+" elementos.");
  88.            }
  89.        }
  90.    }
  91.  
  92.    void getMostrarT(){
  93.        if(getVacia())
  94.            JOptionPane.showMessageDialog(null, "Lista vacia!!");
  95.        else{
  96.            nodo p=cab;
  97.            String aux="";
  98.            int con=0;
  99.            while(p!=null){
  100.                aux = "La información en la posición "+con+" es:\n";
  101.                aux += "Código Producto: "+p.codP+"\n";
  102.                aux += "Nombre Producto: "+p.nomP+"\n";
  103.                aux += "Precio Unitario: "+p.precioU+"\n";
  104.                JOptionPane.showMessageDialog(null, aux);
  105.                con++;
  106.                p=p.sig;
  107.            }
  108.        }
  109.    }
  110.  
  111.    void setElimN( int cod ){
  112.        nodo p = getNodo(cod);
  113.        if( cab == null ){
  114.            JOptionPane.showMessageDialog(null,
  115.            "Lista vacía...");
  116.        }else{
  117.            if(p==null){
  118.                JOptionPane.showMessageDialog(null, "Elemento no existe!");
  119.            }else{
  120.                nodo q = null;
  121.                if((cab.sig==null)&&( p == cab )){
  122.                    cab = p = null;
  123.                    JOptionPane.showMessageDialog(null,
  124.                    "Elemento eliminado.  Lista vacia!!!");
  125.                }
  126.                else if((cab.sig != null)&&(p == cab)){
  127.                    cab = p.sig;
  128.                    p.sig = null;
  129.                    p = null;
  130.                    JOptionPane.showMessageDialog(null,
  131.                    "Elemento eliminado.  Eliminado en la cabecera!!!");
  132.                }
  133.                else if( (p.sig != null)&&(p!=cab) ){
  134.                    q = cab;
  135.                    while( q.sig != p )
  136.                        q = q.sig;
  137.                    q.sig = p.sig;
  138.                    p.sig = null;
  139.                    p = null;
  140.                    JOptionPane.showMessageDialog(null,
  141.                    "Elemento eliminado!!!");
  142.                }
  143.                else{
  144.                    q = cab;
  145.                    while( q.sig != p )
  146.                        q = q.sig;
  147.                    q.sig = null;
  148.                    p = null;
  149.                    JOptionPane.showMessageDialog(null,
  150.                    "Elemento eliminado de la ultima posicion!!!");
  151.                }
  152.            }
  153.        }
  154.    }
  155. }
  156.  

Clase nodo:
Código
  1. package metodos;
  2.  
  3. /**
  4.  *
  5.  * @author Ruben
  6.  */
  7. public class nodo {
  8.    int codP;
  9.    String nomP;
  10.    float precioU;
  11.    nodo sig;
  12.    nodo ant;
  13.  
  14.    public nodo(int codP, String nomP, float precioU) {
  15.        this.codP = codP;
  16.        this.nomP = nomP;
  17.        this.precioU = precioU;
  18.        this.sig = null;
  19.        this.ant=null;
  20.    }
  21.  
  22. }
  23.  


Probador:
Código
  1. package metodos;
  2. import javax.swing.JOptionPane;
  3.  
  4. public class probador {
  5.  
  6.    public static void main(String args[]){
  7.        int op, cod;
  8.        String nomp;
  9.        float precio;
  10.        lista productos = new lista();
  11.        nodo aux=null;
  12.        do{
  13.            op=Integer.parseInt(JOptionPane.showInputDialog(
  14.            "Menu Principal \n"+
  15.            "1. Agregar Producto \n"+
  16.            "2. Mostrar Productos \n"+
  17.            "3. Eliminar Producto \n"+
  18.            "4. Eliminar elemento de una posicion \n"+        
  19.            "5. Eliminar elemntos repetidos \n"+
  20.            "6. Invertir lista \n"+
  21.            "7. Rotar elementos \n"+        
  22.            "8. Salir \n"+
  23.            "Entre su opción: "        
  24.            ));
  25.  
  26.            switch(op){
  27.                case 1:
  28.                    cod = Integer.parseInt(JOptionPane.showInputDialog(
  29.                    "Entre código del producto: "));
  30.                    nomp = JOptionPane.showInputDialog("Entre nombre producto: ");
  31.                    precio = Float.parseFloat(JOptionPane.showInputDialog(
  32.                    "Entre precio unitario: "));
  33.                    aux = new nodo(cod,nomp,precio);
  34.                    productos.setAddFinal(aux);
  35.                break;
  36.                case 2:
  37.                    productos.getMostrarT();
  38.                break;
  39.                case 3:
  40.                    cod = Integer.parseInt(JOptionPane.showInputDialog(
  41.                    "Entre código del producto: "));
  42.                    productos.setElimN(cod);
  43.                break;
  44.                case 4:
  45.                    cod = Integer.parseInt(JOptionPane.showInputDialog(
  46.                    "Ingrese elemento a borrar: "));
  47.                    productos.setElimN(cod);
  48.                break;
  49.                case 5:
  50.  
  51.                break;
  52.                case 6:
  53.                break;
  54.                case 7:
  55.  
  56.                break;
  57.                case 8:
  58.                    JOptionPane.showMessageDialog(null, "Adios!");
  59.                break;    
  60.                default:
  61.                    JOptionPane.showMessageDialog(null, "Opcion invalida!");
  62.            }
  63.  
  64.        }while(op!=8);
  65.        System.exit(0);
  66.    }
  67.  
  68. }
  69.  


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).

Código:
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

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).

Código:
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.