jueves, 24 de enero de 2013

Listas enlazadas en Java


Listas Enlazadas en Java:
Ok, se los voy a explicar como me lo explico mi profesora en su Tiempo, imagina que una lista es igual a la lista de productos que te dan cuando vas al mercado. Ejemplo:

1/1 kg tomate
2 kg tortillas
4 aguacates
2 tomates 
2 kg cebolla.

Ok supongamos que esta es la lista original verdad, bueno si claro, diremos lo podemos hacer con un arreglo ya sea en cualquiera de los muchos tipos que hay unidimensional, dimensional o tridimensional este último también llamado mutidimensional, pues ok, yo les contestaría que si es posible, pero ok, ¿que pasaría si deseamos agregar más productos?, no va faltar quien diga pues le dejo un arreglo más grande, pero recuerden que si no usamos esos espacios de el Array(arreglo), estos se convierten en Variable Vacías y eso hace vulnerable a nuestro sistema o programa, ademas que no podemos declarar Arreglos Dinámicos en java, si a nuestra madre o la persona que nos haya pedido que vayamos al mercado se le hubiese olvidado un producto tendríamos que declarar un arreglo un poco más grande, entonces ahora si lo indicado sería una lista o vectores, pero recordemos que en esta entrada hablaremos de Listas Enlazadas, la ventaja de las listas es que no necesitamos especificar el tamaño de nuestra lista, podemos utilizar el numero de campos que deseemos, teniendo como limitante que el numero de campos debe ser mayor a 2, el dato que va contener nuestra lista y un dato de tipo apuntador, en ejemplo podría ser así: Dato="2 tomates", apuntador=sig. nodo. El campo Dato contiene lo que queremos que nuestra lista lleve en su interior el segundo campo apuntador guarda la referencia al siguiente nodo.

En esto es importante mencionar algunos términos apropiados, clases autoreferenciadas según deytel: es aquella que contiene una variable de instancia que hace referencia a otro objeto del mismo tipo de clase. Por ejemplo, la declaración.

Class Nodo{
Private int datos;
Private Nodo siguientenodo; //referencia al sig nodo
}
La clase Nodo contiene 2 variables de instancia Private : la variable  de tipo entero que se llama datos y una variable de tipo Nodo que se llama siguiente nodo, con este último se hace referencia a un objeto del mismo tipo de objeto que la clase, es por eso que se llama autoreferenciado.
Para mantener y crear estructuras de dinámicas de datos se requiere la asignación dinámica de memoria, esta es la habilidad para que un programa obtenga más espacio en memoria en tiempo de ejecución, para almacenar nuevos nodos y para liberar espacios que ya no necesite.
La expresión de declaración y creación de instancia de clase:
Nodo nodoparaagregar= new Nodo();
Asigna la memoria para almacenar un objeto de tipo Nodo y devuelve la referencia al objeto, que sea signa al nodoparaagregar. Si no hay suficiente espacio en memoria se, la expresión lanza una excepción OutOfMemoryError.




Ok ya vimos que es y ahora veremos un poco de código para que vayamos entrando en materia, pondré uno de los ejercicios que hice en clases:

 class listasimple{
    int numero;
    String nombre;
    listasimple sig;
    public listasimple()
    {
        ;
    }
 
}


Acá está la clase autoreferenciada.

Declaramos tres variables:

listasimple actual=null,inicio=null,ultimo=null;
de tipo listasimple.
decalro un contador
int a=0;

Para llenar la lista podemos usar esta parte del codigo:


if(a==0) //compara si ya entro entro, si entró entonces ya no vale 0 y significa que ya existe el primer nodo
               {
                 actual=new listasimple();//crea un objeto de tipo listasimple
                 System.out.println("INTRODUCE NUMERO ");
                 actual.numero=Integer.parseInt(entrada.readLine());//lee lo que ingresamos por el teclado y le almacena en la variable de tipo int llamada numero del Objeto actual.
                 System.out.println("INTRODUCE EL NOMBRE");
                 actual.nombre=entrada.readLine();
                 inicio=actual;//asigna al nodo inicio el actual.
                 ultimo=actual; //al mismo tiempo es el primer y el último nodo
                 actual.sig=null;//actual.sig=a null osea que no existe un nodo despues
                 a=a+1; //se incrementa uno al contador
                  }

               else
               {//crea nodos sucesorios despues del primer nodo
                actual=new listasimple();
                System.out.println("INTRODUCE NUMERO ");
                actual.numero=Integer.parseInt(entrada.readLine());
                System.out.println("INTRODUCE EL NOMBRE");
                actual.nombre=entrada.readLine();
                ultimo.sig=actual;//al nodo ultimo anteriormente creado en la variable sig. asignamos el actual
                ultimo=actual;//ahora e último es el actual
                actual.sig=null;//actual.sig es null, por que no existe otro atrás de el.
                a=a+1;//se agrega uno al contador.
               }


2 comentarios:

  1. Muy bueno.. pero te falta el de eliminar un producto.. que tal y se arrepiente al comprar un producto ¿Que pasaria?..de ahi todo bien

    ResponderEliminar
    Respuestas
    1. Si lo voy a publicar, voy por partes, de hecho falta lo de buscar y eliminar :)

      Eliminar