Está en la página 1de 8

Lista

Una lista es una estructura dinámica de datos que contiene una colección de


elementos homogéneos (del mismo tipo) de manera que se establece entre ellos
un orden. Es decir, cada elemento, menos el primero, tiene un predecesor, y cada
elemento, menos el último, tiene un sucesor.
Las listas enlazadas son una secuencia de elementos del mismo tipo (nodos)
unidos unos a otros mediante un enlace o puntero. Cada nodo de la lista tiene un
predecesor y un sucesor, excepto el primer elemento de la lista que no tiene
predecesor y el último elemento que no tiene sucesor.
Podemos distinguir, atendiendo a la organización de los nodos, entre:
 Listas simplemente enlazadas: cada nodo tiene un campo que apunta al
siguiente nodo.
 Listas doblemente enlazadas: cada nodo dispone de un puntero que
apunta al siguiente nodo, y otro que apunta al nodo anterior.
Otra distinción puede ser:
 Listas lineales: son listas que tienen un comienzo y un final.
 Listas circulares: en estas listas el último elemento apunta al primero, por
lo tanto podríamos estar recorriéndolas siempre, ya que no tienen final.
Características
La Lista es una estructura de datos muy importante en los lenguajes de
programación donde:
representa una colección de elementos ordenados.
puede contener elementos repetidos.
cada elemento de la lista tiene un índice que lo ubica dentro de la misma.
Una lista enlazada
Es apropiada cuando el número de elementos de datos que se van a representar
en un momento dado es impredecible.
Las listas enlazadas son dinámicas, por lo que la longitud de una lista puede
incrementarse o reducirse, según sea necesario.
•Los elementos se distribuyen de forma dispersa por la memoria: Los bloques de
información no ocupan posiciones consecutivas en la memoria. El orden de la lista
la establecen los enlaces entre bloques de información.
• Acceso a los elementos aleatorio: Puede extraerse información de cualquier
elemento o insertar un bloque en cualquier posición.
•Acceso a los elementos no destructivo: Al contrario que en colas y pilas, la
extracción de un bloque no implica su eliminación.
•El tamaño de la lista puede modificarse de forma dinámica: Al contrario que en
colas y pilas, no hay un número máximo de elementos de la lista (salvo
limitaciones de la capacidad de almacenamiento de la máquina)
Cada elemento contiene un enlace con el siguiente elemento de la lista.
• Conocida la posición de un elemento, podemos recorrer la lista hacia delante
• No es posible recorrer la lista hacia atrás.
• La gestión de la lista se hace con funciones apropiadas para añadir, insertar,
borrar, buscar elementos, etc
Otra fuente
Características

➤ Todos los elementos de la lista son del mismo tipo.

➤ Existe un orden en los elementos, ya que es una estructura lineal, pero los
elementos no están ordenados por su valor sino por la posición en que se han
insertado.

➤ Para cada elemento existe un anterior y un siguiente, excepto para el primero,


que no tiene anterior, y para el último, que no tiene siguiente.

➤ Se puede acceder y eliminar cualquier elemento.

➤ Se pueden insertar elementos en cualquier posición


Operaciones básicas sobre una lista

En general las listas proveen las siguientes operaciones:

 construir una lista


 obtener el tamaño de la lista
 verificar si está vacía
 obtener el primer elemento de la lista, usualmente llamado head o cabeza
 agregar un nuevo elemento a la lista.
 obtener el elemento para un índice dado.

Las operaciones básicas que podemos realizar en cualquier lista, independiente


del tipo que sea, son las siguientes:
 Crear: con esta operación se genera todo lo necesario para trabajar con
una lista.
 Insertar: permite añadir un elemento a la lista. En este caso debemos
indicar al programa si vamos a añadir el elemento nuevo al comienzo de la
lista o al final de la misma.
 Eliminar: se usará para borrar un elemento de la lista. También podremos
indicar si queremos borrar el primero o el último.
 Buscar: busca un elemento en la lista
 Localizar: obtiene la posición del nodo en la lista.
 Vacía: devolverá cierto si la lista está vacía.

Se podrán realizar otras operaciones como destruir la lista completamente, contar


el número de elementos de la misma, añadir un elemento en una determinada
posición, borrar un elemento de una determinada posición, comprobar si hay un
dato en la lista, etc.

Acá vemos un ejemplo en seudo código:


tipo abstracto Lista<T>

operacion crearLista() -> Lista


operacion tamanio(Lista lista) -> int
operacion vacia(Lista lista) -> boolean
operacion cabeza(Lista<T> lista) -> T
operacion agregar(Lista<T> lista, T elemento)
operacion elementoEn(Lista<T> lista, int indice) -> T
operacion removerElementEn(Lista lista, int indice)
Insertar un elemento en una lista vacía
Este es, evidentemente, el caso más sencillo. Partiremos de que ya tenemos el
nodo a insertar y, por supuesto un puntero que apunte a él, además el puntero a la
lista valdrá NULL:
El proceso es muy simple, bastará con que:
1. nodo->siguiente apunte a NULL.
2. Lista apunte a nodo.
Insertar al inicio de una lista
Podemos considerar el caso anterior como un caso particular de éste, la única
diferencia es que en el caso anterior la lista es una lista vacía, pero siempre
podemos, y debemos considerar una lista vacía como una lista.
De nuevo partiremos de un nodo a insertar, con un puntero que apunte a él, y de
una lista, en este caso no vacía:
El proceso sigue siendo muy sencillo:
Hacemos que nodo->siguiente apunte a Lista.
Hacemos que Lista apunte a nodo.
Otra opción

       Verificar si la lista está vacía

a) Si está vacía la lista es decir inicio==null

 Se crea un nuevo nodo o se asigna un nuevo nodo al inicio

 Final se hace que apunte también al inicio ya que es el único nodo.

b) Si ya existe por lo menos un nodo

 Se crea un nodo que se hace que apunte al inicio nuevo.sig=inicio.

 Se hace que inicio ahora apunte al primer elemento que es nuevo


inicio=nuevo.

Otra fuente

Etapas:

 asignación de memoria al nuevo elemento

 rellenar el campo de datos del nuevo elemento

 el puntero siguiente del nuevo elemento apunta hacia el primer elemento

 el puntero inicio apunta hacia el nuevo elemento

 el puntero fin no cambia

 el tamaño es incrementado

Insertar al final de una lista


Para este caso partiremos de una lista no vacía:
1. Necesitamos un puntero que señale al último elemento de la lista. La
manera de conseguirlo es empezar por el primero y avanzar hasta que el
nodo que tenga como siguiente el valor NULL.
2. Hacer que nodo->siguiente sea NULL.
3. Hacer que ultimo->siguiente sea nodo.
Otra fuente

Al final de la lista

Verificar si la lista está vacía

a) Si está vacía la lista es decir inicio==null

 Se crea un nuevo nodo o se asigna un nuevo nodo al inicio

 Final se hace que apunte también al inicio ya que es el único nodo.

b) Si ya existe por lo menos un nodo

 Se crea o se asigna un nuevo nodo a fin.sig=nuevo;

 Final se hace que apunte al nuevo nodo ya que ahora será el final.

Otra fuente

Etapas:

 asignación de memoria al nuevo elemento

 rellenar el campo de datos del nuevo elemento

 el puntero siguiente del último elemento apunta hacia el nuevo elemento

 el puntero fin apunta hacia el nuevo elemento

 el puntero inicio no cambia

 el tamaño es incrementado.

Insertar un elemento en una lista después de otro en referencia (No lo


conseguí pero encontré un similar que es el de *Insertar un elemento a
continuación de un nodo cualquiera de una lista*)

Insertar un elemento a continuación de un nodo cualquiera de una lista

Ahora el nodo "anterior" será aquel a continuación del cual insertaremos el nuevo
nodo:
Suponemos que ya disponemos del nuevo nodo a insertar, apuntado por nodo, y
un puntero al nodo a continuación del que lo insertaremos.

El proceso a seguir será:

Hacer que nodo->siguiente señale a anterior->siguiente.

Hacer que anterior->siguiente señale a nodo.

Insertar un elemento en una posición absoluta dada en la lista

       Verificar si la lista está vacía o posición es igual a cero

a) Si está vacía la lista es decir inicio==null


 Se crea un nuevo nodo o se asigna un nuevo nodo al inicio
 Final se hace que apunte también al inicio ya que es el único nodo.

c) Si ya existe por lo menos un nodo


 Se recorre la lista contando las posiciones de los elementos dentro de la
lista (pos++), además se debe de recorrer conociendo el nodo anterior y el
siguiente con el fin de reorganizar la lista al insertar un nuevo elemento.
 Si se localiza la posición buscada y siguiente es
diferente de null.   if(cont==posi && sig!=null)
 Se crea un nuevo nodo y se hace que apunte al
siguiente nodo y además que el nodo anterior apunte al
nuevo nodo.  nuevo.sig=sig  y ant.sig=nuevo.
 Si no se localiza la posición (indica que se dio una posición
mayor a la cantidad de elementos, entonces se agrega el
elemento al final de la lista.

Otra fuente

Etapas:

 asignación de memoria al nuevo elemento


 rellenar el campo de datos del nuevo elemento
 Elegir una posición en la lista (la inserción se hará después de haber
elegido la posición)
 el puntero siguiente del nuevo elemento apunta hacia la dirección a la que
apunta el puntero siguiente del elemento actual.
 el puntero siguiente del elemento actual apunta al nuevo elemento
 los punteros inicio y fin no cambian
 el tamaño se incrementa en una unidad.

Eliminar un elemento de una lista en el inicio


Es el caso más simple. Partiremos de una lista con uno o más nodos, y usaremos
un puntero auxiliar, nodo:
1. Hacemos que nodo apunte al primer elemento de la lista, es decir a
Lista.
2. Asignamos a Lista la dirección del segundo nodo de la lista: Lista-
>siguiente.
3. Liberamos la memoria asignada al primer nodo, el que queremos
eliminar.
Si no guardamos el puntero al primer nodo antes de actualizar Lista, después nos
resultaría imposible liberar la memoria que ocupa. Si liberamos la memoria antes
de actualizar Lista, perderemos el puntero al segundo nodo.
Si la lista sólo tiene un nodo, el proceso es también válido, ya que el valor de
Lista->siguiente es NULL, y después de eliminar el primer nodo la lista quedará
vacía, y el valor de Lista será NULL.
De hecho, el proceso que se suele usar para borrar listas completas es eliminar el
primer nodo hasta que la lista esté vacía.
Otra fuente
Verificar si la lista está vacía

a)   Verificar si hay un solo nodo


 Si hay un solo nodo se pone ini=fin=null
b) Si hay más de un nodo
 El inicio es ahora el siguiente ini=ini.sig

Eliminar un elemento de una lista en el final

Verificar si la lista está vacía

a) Verificar si hay un solo nodo


 Si hay un solo nodo se pone ini=fin=null
b) Si hay más de un nodo
 Se debe recorrer la lista llevando el anterior y el siguiente mientras que
anterior.sig sea diferente del final o del siguiente.  (debe de construir
primero el nodo anterior para poder comparar con siguiente)
 Al llegar al final entonces el anterior se debe de poner como final, y a
final.sig como null

Eliminar un elemento de una lista según un dato contenido en referencia (no


lo conseguí)

Eliminar un elemento de una lista según su posición absoluta dada en la lista

Verificar si la lista está vacía


a) Verificar si hay un solo nodo
 Si hay un solo nodo se pone ini=fin=null
a) Si hay más de un nodo
 Se debe recorrer la lista llevando el anterior, siguiente y el contador de las
posiciones mientras que siguiente sea diferente de null.
 Si cont==0 entonces se elimina del inicio
 En otro caso si cont==pose y además sig!=null se pone a anterior.sig la
dirección de siguiente.sig para eliminar a siguiente.
 §  También hay que verificar si es el último elemento para ponerlo como
final  si anterior.sig==null entonces se debe poner como final.    fin=ant;
 Si no se localiza la posición se elimina del final de la lista.

Otra fuente

1. Hacemos que nodo apunte al nodo que queremos borrar.


2. Ahora, asignamos como nodo siguiente del nodo anterior, el siguiente al
que queremos eliminar: anterior->siguiente = nodo->siguiente.
3. Eliminamos la memoria asociada al nodo que queremos eliminar.

También podría gustarte