miércoles, 18 de noviembre de 2015

Ejercicio 2 - Listas Simples Enlazadas

f
Enunciado:

Crear una lista simple enlazada de números enteros, se desea añadir un nodo entre dos nodos consecutivos; el dato del nuevo nodo debe ser la diferencia en valor absoluto de los dos nodos.

Ejemplo: si tengo la siguiente lista:

 |   20   |   |   43   |  |   17   |  |   4    |  |    11   |
Se debe insertar un dato entre 43 y 17
Reviso que exista secuencia
Luego calculo el valor absoluto de  (43-17)
Inserto entre esos elementos.
 |   20   |   |   43   |  |   26  |  |   17   |  |   4    |  |    11   |
Para realizar este ejercicio es necesario tener en cuenta, al igual que en el anterior, las definiciones sobre listas simples enlazadas,  así mismo de busquedas para encontrar el número que sirva como referencia para calcular el valor absoluto y el método correcto para insertar un nodo entre dos nodos. Se utiliza la libreria JOptionPane para establecer un mensaje emergente.

A continuación se muestra el código:
Clase Nodo:

public class Nodo 
{

 //Declaración de atributos
 private int dato;
 private Nodo siguiente;
 
 //Constructor Nodo null
 public Nodo(int dato)
 {
  this.dato=dato;
  this.siguiente=null;
 }
 //Constructor Nodo con parametro
 public Nodo(int dato, Nodo siguiente)
 {
  this.dato=dato;
  this.siguiente=siguiente;
 }

 //Metodos getters and setters
 public int getDato() {
  return dato;
 }

 public void setDato(int dato) {
  this.dato = dato;
 }

 public Nodo getSiguiente() {
  return siguiente;
 }

 public void setSiguiente(Nodo siguiente) {
  this.siguiente = siguiente;
 }
 
}

Clase Lista:

public class Lista 
{

 private Nodo inicio;
 private Nodo fin;
 
 public Lista()
 {
  inicio=fin=null;
 }
 
 //Metodo para agregar inicio
 public void agregarInicio(int info)
 {
  Nodo nuevo=new Nodo(info, inicio);
  if(inicio==null)
  {
   inicio=fin=nuevo;
  }
  inicio=nuevo;
 }
 
 //Metodo para agregar fin
 public void agregarFin(int info)
 {
  Nodo nuevo=new Nodo(info, null);
  if(inicio==null)
  {
   inicio=fin=nuevo;
  }
  else
  {
   fin.setSiguiente(nuevo);
   fin=nuevo;
  }
 }
 
 //Metodo para imprimir
 public void imprimir()
 {
  Nodo aux=inicio;
  while(aux!=null)
  {
   System.out.println(aux.getDato());
   aux=aux.getSiguiente();
  }
 }
 
 //Metodo para eliminar el nodo
 public void eliminarNodo(int numero)
 {
  if(inicio!=null)
  {
   if((inicio==fin)&&(inicio.getDato()==numero))
   {
    inicio=fin=null;
   }
   else if(inicio.getDato()==numero)
   {
    inicio=inicio.getSiguiente();
   }
   else
   {
    Nodo anterior=inicio;
    Nodo siguiente=inicio.getSiguiente();
    while((siguiente!=null)&&(siguiente.getDato()!=numero))
    {
     anterior=siguiente;
     siguiente=siguiente.getSiguiente();
    }
    if(siguiente!=null)
    {
     anterior.setSiguiente(siguiente.getSiguiente());
     if(siguiente==fin)
     {
      fin=anterior;
     }
    }
   }
  }
 }
 
 //Metodo para agregar un nodo
 public void agregarNodo(int numero)
 {
  if(inicio!=null)
  {
   if(inicio==fin && inicio.getDato()==numero)
   {
    inicio=fin=null;
   }
   else if(inicio.getDato()==numero)
   {
    inicio = inicio.getSiguiente();
   }
   else
   {    
    Nodo anterior = inicio;
    Nodo siguiente = inicio.getSiguiente();   
    while(siguiente!=null && anterior.getDato()!=numero)
    {
    anterior = siguiente;
    siguiente = siguiente.getSiguiente();
    }
    if (siguiente!=null)
    {
     Nodo nuevo = new Nodo(calculo(anterior.getDato(),siguiente.getDato()),siguiente);     
     anterior.setSiguiente(nuevo);
     nuevo.setSiguiente(siguiente);
     if(siguiente == fin)
     {
      fin = anterior;
     }
    }
   }  
  }
 }

 //Metodo para calcular el valor absoluto entre dos numeros ubicados en los nodos
 public int calculo(int primer, int segundo)
 {
  int num = primer -segundo;   
  num =Math.abs(num);
  return num;  
 }

}

Clase Principal:
import javax.swing.JOptionPane;

public class Principal {

 public static void main(String[] args) 
 {
 Lista array = new Lista();
  
  array.agregarInicio(17);
  array.agregarInicio(43);
  array.agregarInicio(20);
  array.agregarFin(4);
  array.agregarFin(11);
  System.out.println("Lista inicial");
  array.imprimir();
  
  int agregar = Integer.parseInt(JOptionPane.showInputDialog("Ingrese el numero para que el nuevo valor se ubique despues de este"));
  
  array.agregarNodo(agregar);
  System.out.println("Nueva lista:");
  array.imprimir(); 
 }
}
Capturas de pantalla del programa:




1 comentario: