Documentos de Académico
Documentos de Profesional
Documentos de Cultura
La lista enlazada es un TDA que nos permite almacenar datos de una forma
organizada, al igual que los vectores pero, a diferencia de estos, esta estructura es
dinámica, por lo que no tenemos que saber "a priori" los elementos que puede
contener.
En una lista enlazada, cada elemento apunta al siguiente excepto el último que no
tiene sucesor y el valor del enlace es null. Por ello los elementos son registros que
contienen el dato a almacenar y un enlace al siguiente elemento. Los elementos
de una lista, suelen recibir también el nombre de nodos de la lista.
Las operaciones que podemos realizar sobre una lista enlazada son las
siguientes:
Recorrido. Esta operación consiste en visitar cada uno de los nodos que forman
la lista. Para recorrer todos los nodos de la lista, se comienza con el primero, se
toma el valor del campo liga para avanzar al segundo nodo, el campo liga de este
nodo nos dará la dirección del tercer nodo, y así sucesivamente.
Inserción. Esta operación consiste en agregar un nuevo nodo a la lista. Para esta
operación se pueden considerar tres casos:
Búsqueda. Esta operación consiste en visitar cada uno de los nodos, tomando al
campo liga como puntero al siguiente nodo a visitar.
Una lista enlazada simple contiene dos valores: el valor actual del nodo y un
enlace al siguiente nodo.
Una lista doblemente enlazada contiene tres valores: el valor, el link al nodo
siguiente, y el link al anterior
Las listas enlazadas son usadas como módulos para otras muchas estructuras de
datos, tales como pilas, colas y sus variaciones.
El campo de datos de un nodo puede ser otra lista enlazada. Mediante este
mecanismo, podemos construir muchas estructuras de datos enlazadas con listas;
esta práctica tiene su origen en el lenguaje de programación Lisp, donde las listas
enlazadas son una estructura de datos primaria (aunque no la única), y ahora es
una característica común en el estilo de programación funcional.
A veces, las listas enlazadas son usadas para implementar arrays asociativos, y
estas en el contexto de las llamadas listas asociativas. Hay pocas ventajas en este
uso de las listas enlazadas; hay mejores formas de implementar éstas estructuras,
por ejemplo con árboles binarios de búsqueda equilibrados. Sin embargo, a veces
una lista enlazada es dinámicamente creada fuera de un subconjunto propio de
nodos semejante a un árbol, y son usadas más eficientemente para recorrer ésta
serie de datos
El almacenamiento externo, por otro lado, tiene la ventaja de ser más genérico, en
la misma estructura de datos y código máquina puede ser usado para una lista
enlazada, no importa cual sea su tamaño o los datos. Esto hace que sea más fácil
colocar el mismo dato en múltiples listas enlazadas. Aunque con el
almacenamiento interno los mismos datos pueden ser colocados en múltiples
listas incluyendo múltiples referencias siguientes en la estructura de datos del
nodo, esto podría ser entonces necesario para crear rutinas separadas para añadir
o borrar celdas basadas en cada campo. Esto es posible creando listas enlazadas
de elementos adicionales que usen almacenamiento interno usando
almacenamiento externo, y teniendo las celdas de las listas enlazadas adicionales
almacenadas las referencias a los nodos de las listas enlazadas que contienen los
datos.
Otro enfoque que puede ser usado con algunos lenguajes implica tener diferentes
estructuras de datos, pero todas tienen los campos iniciales, incluyendo la
siguiente (y anterior si es una lista doblemente enlazada) referencia en la misma
localización. Después de definir estructuras distintas para cada tipo de dato, una
estructura genérica puede ser definida para que contenga la mínima cantidad de
datos compartidos por todas las estructuras y contenidos al principio de las
estructuras. Entonces las rutinas genéricas pueden ser creadas usando las
mínimas estructuras para llevar a cabo las operaciones de los tipos de las listas
enlazadas, pero separando las rutinas que pueden manejar los datos específicos.
Este enfoque es usado a menudo en rutinas de análisis de mensajes, donde
varios tipos de mensajes son recibidos, pero todos empiezan con la misma serie
de campos, generalmente incluyendo un campo para el tipo de mensaje. Las
rutinas genéricas son usadas para añadir nuevos mensajes a una cola cuando son
recibidos, y eliminarlos de la cola en orden para procesarlos. El campo de tipo de
mensaje es usado para llamar a la rutina correcta para procesar el tipo específico
de mensaje.