Conviértete en un emprendedor,profesional del conocimiento en la programación

martes, 10 de enero de 2012

LISTAS DOBLES

Compartir con:


LISTAS DOBLES

●La unidad de una lista enlazada es el Nodo el cual es una clase.

●La clase Nodo, tiene tres atributos básicos:

Información: objeto que guarda los datos correspondientes a sus atributos, como
                                 código,   apellidos, nombres, etc.

       Siguiente: objeto apuntador al siguiente nodo, es un objeto del mismo tipo de la clase
                           Nodo.

    Anterior: objeto apuntador al anterior nodo, es un objeto del mismo tipo de la clase
                          Nodo.




Representación gráfica:






Lista vacía:

          Inicio = null







Operación de Recorrido: de izquierda a derecha y de derecha a izquierda.



           

Ventajas:

●Al identificar a un nodo, automáticamente se identifica el anterior y el siguiente.

●El recorrido se puede realizar en ambos sentidos.

Desventajas:

●Requiere de espacio de memoria extra para el apuntador del anterior.

●Las operaciones de inserción y eliminación requieren mayor cuidado que las listas simples.



 Ejercicio 1

Considere la clase Empleado con los siguientes atributos: código(cadena), nombre(cadena), sueldo(real).

Diseñe la clase NodoEmpleado con los siguientes atributos: un objeto info de tipo Empleado, un objeto siguiente de tipo NodoEmpleado y un objeto anterior de tipo NodoEmpleado.

Diseñe la clase ListaDobleEmpleados con los siguientes atributos: un objeto inicio de tipo NodoEmpleado, un contador de empleados tipo entero. También considere los siguientes métodos de administración: agregaAlFinal(), elimina(), busca(), getN().

Diseñe la clase PanelEmpleados con el siguiente atributo: un objeto lde de tipo ListaDobleEmpleados y con la siguiente interface gráfica:



 Programe la acción de los botones. Diseñe la clase Principal (Frame) y haga funcionar su aplicación.





Solución:

package ListaDoble;

public class Empleado {

    private String Codigo, Nombre;
    private double Sueldo;

    public Empleado() {   }

    public Empleado (String Codigo,String Nombre,double Sueldo){
        this.Codigo = Codigo;
        this.Nombre = Nombre;
        this.Sueldo = Sueldo;
    }

    public String getCodigo() {
        return Codigo;
    }

    public void setCodigo(String Codigo) {
        this.Codigo = Codigo;
    }

    public String getNombre() {
        return Nombre;
    }

    public void setNombre(String Nombre) {
        this.Nombre = Nombre;
    }

    public double getSueldo() {
        return Sueldo;
    }

    public void setSueldo(double Sueldo) {
        this.Sueldo = Sueldo;
    }


         } // Fin de la clase Empleado



package ListaDoble;


public class NodoEmpleado {

    private Empleado unEmpleado;
    private NodoEmpleado ApuntSgte;
    private NodoEmpleado ApuntAnt;

    public NodoEmpleado(Empleado unEmpleado){
        this.ApuntAnt=null;
        this.unEmpleado = unEmpleado;
        this.ApuntSgte=null;
    
    }

    public void setUnEmpleado(Empleado unEmpleado){
        this.unEmpleado = unEmpleado;
    }

    public void setApuntSgte(NodoEmpleado ApuntSgte){
        this.ApuntSgte = ApuntSgte;
    }
    public Empleado getUnEmpleado(){
        return unEmpleado;
    }
   
    public NodoEmpleado getApuntSgte(){
        return ApuntSgte;
    }

    public NodoEmpleado getApuntAnt() {
        return ApuntAnt;
    }

    public void setApuntAnt(NodoEmpleado ApuntAnt) {
        this.ApuntAnt = ApuntAnt;
    }


} // Fin de la Clase NodoEmpleado





package ListaDoble;

import javax.swing.JTextArea;


public class ListaDobleEmpleados {

    private NodoEmpleado inicio;
    private int Contador;

    public ListaDobleEmpleados(){
       inicio=null;
    }
    public NodoEmpleado getInicio() {
        return inicio;
    }

    public void setInicio(NodoEmpleado inicio) {
        this.inicio = inicio;
    }

    public int getContador() {
        return Contador;
    }

    public void setContador(int Contador) {
        this.Contador = Contador;
    }

    //Metodos de administracion
  
 public void agrega(Empleado unEmpleado){
        NodoEmpleado nuevo;
        nuevo= new NodoEmpleado(unEmpleado);
     //final
        if(inicio==null)
            inicio=nuevo;
        else{
            NodoEmpleado aux=inicio;
            while(aux.getApuntSgte()!=null)
                aux=aux.getApuntSgte();

             aux.setApuntSgte(nuevo);
             nuevo.setApuntAnt(aux);
        }
    }

     public Empleado busca(String Codigo){
         NodoEmpleado Auxiliar = inicio;

         while(Auxiliar!=null){
             if(Codigo.equals(Auxiliar.getUnEmpleado().getCodigo()))
                 return Auxiliar.getUnEmpleado();
   else
                  Auxiliar = Auxiliar.getApuntSgte();
        }
         return null;
}
public void elimina(String Codigo) {
    NodoEmpleado aux=inicio;

    while(aux!=null){

    Empleado p=aux.getUnEmpleado();
    if(p.getCodigo().equals(Codigo)){
        aux.getApuntSgte().setApuntAnt(aux.getApuntAnt());
        aux.getApuntAnt().setApuntSgte(aux.getApuntSgte());
     }
    aux=aux.getApuntSgte();
    }
 }

 public int getN() {
        NodoEmpleado aux = inicio;
        int c = 0;
        while(aux != null) {
            c++;
            aux = aux.getApuntSgte();
        }
        return c;
    }

    public void listainversa(JTextArea salida){
        salida.setText("Codigo\tNombre\tSueldo\n");
        NodoEmpleado aux=inicio;
        while(aux.getApuntSgte()!=null) aux=aux.getApuntSgte();
                   
while(aux!=null){Empleadoe=aux.getUnEmpleado();salida.append(e.getCodigo()+"\t"+e.getNombre()+"\t"+e.getSueldo()+"\n");aux=aux.getApuntAnt();}
       
    }
  } // Fin de la  clase ListaDobleEmpleados




Panel Lista Doble Empleados





 Programando la acción de los botones, y creando un objeto tipo ListaDobleEmpleados lde para llamar a los métodos.

package ListaDoble;
import javax.swing.JOptionPane;
public class PanelPrincipal extends javax.swing.JPanel {
 private ListaDobleEmpleados lde;
     public PanelPrincipal() {
        initComponents();
   lde = new ListaDobleEmpleados();
      }




private void btnAgregaActionPerformed(java.awt.event.ActionEvent evt) {        
                                
             if(lde.busca(txtCodigo.getText())!=null){
                       mensaje(" Codigo ya existe");}
          else {
                     lde.agrega( new Empleado(leeCodigo(),leeNombre(),leeSueldo()) );  }
            lista();
   
         limpia();
 
    }                                        
public String leeCodigo() {     return txtCodigo.getText();}

public String leeNombre(){    return txtNombre.getText();}

public double leeSueldo() {
            return Double.parseDouble(txtSueldo.getText());
}
           public void mensaje(String s) {
            JOptionPane.showMessageDialog(this,s);}

     public void imprime(String s){
               txtSalida.append(s+"\n");

           }

     public void limpia(){
              txtCodigo.setText("");
              txtNombre.setText("");
              txtSueldo.setText("");
              txtCodigo.requestFocus();}
  
   public void lista(){
        txtSalida.setText("Codigo\tNombre\tSueldo\n");
        NodoEmpleado i=lde.getInicio();
        while(i!=null){
            Empleado e =i.getUnEmpleado();
            imprime(e.getCodigo()+"\t"+
                    e.getNombre()+"\t"+
                    e.getSueldo());
        i=i.getApuntSgte();

        }   
  }


private void btnBuscaActionPerformed(java.awt.event.ActionEvent evt) {     
                                  
        Empleado e=lde.busca(leeCodigo());
        if(e==null){
          mensaje("Codigo No existe");
        }
         else {
            txtNombre.setText(e.getNombre());
            txtSueldo.setText(e.getSueldo()+"");
        }
    }                                       

    private void btnEliminaActionPerformed(java.awt.event.ActionEvent evt) { 
                                        
if(lde.busca(txtCodigo.getText())==null)  
     JOptionPane.showMessageDialog(this, "Existe ya este codigo.\nIngrese otro codigo.");
        else{
            lde.elimina(txtCodigo.getText());

        }
    }                                         

    private void btnListaActionPerformed(java.awt.event.ActionEvent evt) {                                        
           lista();
    }                                       

    private void btnListaInversaActionPerformed(java.awt.event.ActionEvent evt) {                                               
        lde.listainversa(txtSalida);
    }     
    private javax.swing.JButton btnAgrega;
    private javax.swing.JButton btnBusca;
    private javax.swing.JButton btnElimina;
    private javax.swing.JButton btnLista;
    private javax.swing.JButton btnListaInversa;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextField txtCodigo;
    private javax.swing.JTextField txtNombre;
    private javax.swing.JTextArea txtSalida;
    private javax.swing.JTextField txtSueldo;

}  // Fin en la programación del Panel


Diseño de la clase Principal (Frame)




Programando en el Frame para ejecutar el programa.

package ListaDoble;
public class Principal extends javax.swing.JFrame {  
    public Principal() {
        initComponents();
    add(new PanelPrincipal());
    pack();
    }
public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
                 public void run() {
                new Principal().setVisible(true);      }
        });
    }
} // Ejecute el Programa




0 comentarios:

Publicar un comentario