linked list data structure c with illustration
Un estudio detallado de la lista vinculada en C ++.
Una lista vinculada es una estructura de datos dinámica lineal para almacenar elementos de datos. Ya hemos visto matrices en nuestros temas anteriores sobre C ++ básico. También sabemos que las matrices son una estructura de datos lineal que almacena elementos de datos en ubicaciones contiguas.
A diferencia de las matrices, la lista vinculada no almacena elementos de datos en ubicaciones de memoria contiguas.
Una lista vinculada consta de elementos llamados 'Nodos' que contienen dos partes. La primera parte almacena los datos reales y la segunda parte tiene un puntero que apunta al siguiente nodo. Esta estructura suele denominarse 'Lista enlazada individualmente'.
=> Vea los mejores tutoriales de capacitación de C ++ aquí.
Lo que vas a aprender:
Lista vinculada en C ++
Echaremos un vistazo a la lista de enlaces individuales en detalle en este tutorial.
El siguiente diagrama muestra la estructura de una lista enlazada individualmente.
Como se muestra arriba, el primer nodo de la lista enlazada se llama 'cabeza' mientras que el último nodo se llama 'Cola'. Como vemos, el último nodo de la lista enlazada tendrá su siguiente puntero como nulo ya que no tendrá ninguna dirección de memoria apuntada.
Dado que cada nodo tiene un puntero al siguiente nodo, los elementos de datos de la lista vinculada no necesitan almacenarse en ubicaciones contiguas. Los nodos pueden estar dispersos en la memoria. Podemos acceder a los nodos en cualquier momento ya que cada nodo tendrá una dirección del siguiente nodo.
Podemos agregar elementos de datos a la lista vinculada, así como eliminar elementos de la lista fácilmente. Por lo tanto, es posible aumentar o reducir la lista enlazada de forma dinámica. No hay un límite superior en la cantidad de elementos de datos que pueden estar en la lista vinculada. Por lo tanto, mientras haya memoria disponible, podemos agregar tantos elementos de datos a la lista vinculada.
Además de la fácil inserción y eliminación, la lista vinculada tampoco desperdicia espacio en la memoria, ya que no necesitamos especificar de antemano cuántos elementos necesitamos en la lista vinculada. El único espacio que ocupa la lista vinculada es para almacenar el puntero al siguiente nodo que agrega un poco de sobrecarga.
A continuación, analizaremos las diversas operaciones que se pueden realizar en una lista vinculada.
Operaciones
Al igual que las otras estructuras de datos, también podemos realizar varias operaciones para la lista vinculada. Pero a diferencia de las matrices, en las que podemos acceder al elemento usando un subíndice directamente incluso si está en algún punto intermedio, no podemos hacer el mismo acceso aleatorio con una lista enlazada.
Para acceder a cualquier nodo, necesitamos recorrer la lista enlazada desde el principio y solo entonces podemos acceder al nodo deseado. Por tanto, acceder a los datos de forma aleatoria desde la lista enlazada resulta caro.
Podemos realizar varias operaciones en una lista vinculada como se indica a continuación:
# 1) Inserción
La operación de inserción de la lista vinculada agrega un elemento a la lista vinculada. Aunque pueda parecer simple, dada la estructura de la lista vinculada, sabemos que cada vez que se agrega un elemento de datos a la lista vinculada, necesitamos cambiar los siguientes punteros de los nodos anterior y siguiente del nuevo elemento que hemos insertado.
Lo segundo que debemos considerar es el lugar donde se agregará el nuevo elemento de datos.
Hay tres posiciones en la lista vinculada donde se puede agregar un elemento de datos.
# 1) Al comienzo de la lista vinculada
A continuación se muestra una lista vinculada 2-> 4-> 6-> 8-> 10. Si queremos agregar un nuevo nodo 1, como el primer nodo de la lista, entonces la cabeza que apunta al nodo 2 ahora apuntará a 1 y el siguiente puntero del nodo 1 tendrá una dirección de memoria del nodo 2 como se muestra a continuación. figura.
Por tanto, la nueva lista enlazada se convierte en 1-> 2-> 4-> 6-> 8-> 10.
# 2) Después del nodo dado
Aquí, se da un nodo y tenemos que agregar un nuevo nodo después del nodo dado. En la lista vinculada a continuación a-> b-> c-> d -> e, si queremos agregar un nodo f después del nodo c, la lista vinculada se verá de la siguiente manera:
Por lo tanto, en el diagrama anterior, verificamos si el nodo dado está presente. Si está presente, creamos un nuevo nodo f. Luego apuntamos el siguiente puntero del nodo c para apuntar al nuevo nodo f. El siguiente puntero del nodo f ahora apunta al nodo d.
# 3) Al final de la lista vinculada
En el tercer caso, agregamos un nuevo nodo al final de la lista vinculada. Considere que tenemos la misma lista enlazada a-> b-> c-> d-> e y necesitamos agregar un nodo f al final de la lista. La lista vinculada se verá como se muestra a continuación después de agregar el nodo.
Así creamos un nuevo nodo f. Luego, el puntero de cola que apunta a nulo apunta af y el siguiente puntero del nodo f apunta a nulo. Hemos implementado los tres tipos de funciones de inserción en el programa C ++ a continuación.
cómo iniciar un nuevo proyecto en eclipse
En C ++, podemos declarar una lista enlazada como una estructura o como una clase. Declarar una lista vinculada como una estructura es una declaración de estilo C tradicional. Una lista vinculada como clase se usa en C ++ moderno, principalmente mientras se usa la biblioteca de plantillas estándar.
En el siguiente programa, hemos utilizado la estructura para declarar y crear una lista vinculada. Tendrá datos y un puntero al siguiente elemento como miembros.
|_+_|Producción:
Lista final vinculada:
30–> 20–> 50–> 10–> 40–> nulo
A continuación, implementamos la operación de inserción de lista vinculada en Java. En lenguaje Java, la lista enlazada se implementa como una clase. El siguiente programa es similar en lógica al programa C ++, la única diferencia es que usamos una clase para la lista vinculada.
|_+_|Producción:
Lista final vinculada:
10–> 20–> 30–> 40–> 50–> nulo
Tanto en el programa anterior, C ++ como en Java, tenemos funciones separadas para agregar un nodo al frente de la lista, al final de la lista y entre las listas dadas en un nodo. Al final, imprimimos el contenido de la lista creada utilizando los tres métodos.
# 2) Eliminación
Al igual que la inserción, eliminar un nodo de una lista vinculada también implica varias posiciones desde donde se puede eliminar el nodo. Podemos eliminar el primer nodo, el último nodo o un k-ésimo nodo aleatorio de la lista vinculada. Después de la eliminación, necesitamos ajustar el siguiente puntero y los otros punteros en la lista vinculada de manera apropiada para mantener la lista vinculada intacta.
En la siguiente implementación de C ++, hemos proporcionado dos métodos de eliminación, es decir, eliminar el primer nodo de la lista y eliminar el último nodo de la lista. Primero creamos una lista agregando nodos al encabezado. Luego mostramos el contenido de la lista después de la inserción y cada eliminación.
|_+_|Producción:
Lista vinculada creada
10–>8–>6–>4–>2–
> NULO
Lista vinculada después de eliminar el nodo principal
8–>6–>4–>2–
> NULO
Lista vinculada después de eliminar el último nodo
8–> 6–> 4–> NULL
Lo siguiente es la implementación de Java para eliminar nodos de la lista vinculada. La lógica de implementación es la misma que se usa en el programa C ++. La única diferencia es que la lista vinculada se declara como una clase.
|_+_|Producción:
Lista vinculada creada:
9–>7–>5–>3–>1–
> nulo
Lista vinculada después de eliminar el nodo principal:
7–>5–>3–>1–
> nulo
Lista vinculada después de eliminar el último nodo:
7–> 5–> 3–> nulo
Cuente el número de nodos
La operación para contar el número de nodos se puede realizar mientras se recorre la lista vinculada. Ya hemos visto en la implementación anterior que siempre que necesitemos insertar / eliminar un nodo o mostrar el contenido de la lista vinculada, debemos recorrer la lista vinculada desde el principio.
Mantener un contador e incrementarlo a medida que atravesamos cada nodo nos dará el recuento del número de nodos presentes en la lista vinculada. Dejaremos este programa para que lo implementen los lectores.
Matrices y listas vinculadas
Habiendo visto las operaciones y la implementación de la lista enlazada, comparemos cómo las matrices y la lista enlazada son comparables entre sí.
Matrices | Listas vinculadas |
---|---|
Las matrices tienen un tamaño fijo | El tamaño de la lista vinculada es dinámico |
La inserción de un nuevo elemento es costosa | La inserción / eliminación es más fácil |
Se permite el acceso aleatorio | No es posible el acceso aleatorio |
Los elementos están en una ubicación contigua | Los elementos tienen una ubicación no contigua |
No se requiere espacio adicional para el siguiente puntero | Se requiere espacio de memoria adicional para el siguiente puntero |
Aplicaciones
Como las matrices y las listas vinculadas se utilizan para almacenar elementos y son estructuras de datos lineales, ambas estructuras se pueden utilizar de forma similar para la mayoría de las aplicaciones.
Algunas de las aplicaciones para listas enlazadas son las siguientes:
- Se puede usar una lista vinculada para implementar pilas y colas.
- Una lista vinculada también se puede utilizar para implementar gráficos siempre que tengamos que representar gráficos como listas de adyacencia.
- Un polinomio matemático se puede almacenar como una lista vinculada.
- En el caso de la técnica de hash, los cubos utilizados en el hash se implementan utilizando las listas enlazadas.
- Siempre que un programa requiera una asignación dinámica de memoria, podemos usar una lista vinculada, ya que las listas vinculadas funcionan de manera más eficiente en este caso.
Conclusión
Las listas vinculadas son las estructuras de datos que se utilizan para almacenar elementos de datos de forma lineal pero en ubicaciones no contiguas. Una lista vinculada es una colección de nodos que contienen una parte de datos y un puntero siguiente que contiene la dirección de memoria del siguiente elemento de la lista.
El último elemento de la lista tiene su siguiente puntero establecido en NULL, lo que indica el final de la lista. El primer elemento de la lista se llama Head. La lista vinculada admite varias operaciones como inserción, eliminación, recorrido, etc. En caso de asignación de memoria dinámica, se prefieren las listas vinculadas a las matrices.
Las listas enlazadas son caras en lo que respecta a su recorrido, ya que no podemos acceder aleatoriamente a los elementos como matrices. Sin embargo, las operaciones de inserción-eliminación son menos costosas en comparación con las matrices.
Hemos aprendido todo sobre las listas vinculadas lineales en este tutorial. Las listas enlazadas también pueden ser circulares o dobles. Veremos en profundidad estas listas en nuestros próximos tutoriales.
=> Consulte aquí la serie completa de capacitación en C ++.
Lectura recomendada
- Estructura de datos de lista enlazada circular en C ++ con ilustración
- Estructura de datos de lista doblemente enlazada en C ++ con ilustración
- Estructura de datos de cola en C ++ con ilustración
- Estructura de datos de pila en C ++ con ilustración
- Estructura de datos de cola de prioridad en C ++ con ilustración
- Las 15 mejores herramientas gratuitas de minería de datos: la lista más completa
- 15 mejores herramientas ETL en 2021 (una lista completa actualizada)
- Introducción a las estructuras de datos en C ++