Las listas enlazadas son una estructura de datos fundamental en la programación que permite almacenar una colección de elementos de manera dinámica. A diferencia de los arreglos, las listas enlazadas no requieren un tamaño fijo y pueden crecer o reducirse según sea necesario. En Fortran, las listas enlazadas se implementan utilizando tipos derivados y punteros.
Conceptos Clave
- Nodo: La unidad básica de una lista enlazada, que contiene un valor y un puntero al siguiente nodo.
- Cabeza (Head): El primer nodo de la lista enlazada.
- Puntero: Una variable que almacena la dirección de memoria de otro dato.
Estructura de un Nodo
En Fortran, un nodo de una lista enlazada se puede definir utilizando un tipo derivado que contiene un valor y un puntero al siguiente nodo.
En este ejemplo, Node es un tipo derivado que contiene un entero value y un puntero next que apunta al siguiente nodo. El puntero se inicializa a null() para indicar que no apunta a ningún nodo inicialmente.
Creación de una Lista Enlazada
Para crear una lista enlazada, necesitamos una variable que apunte al primer nodo (cabeza) de la lista.
Insertar un Nodo al Inicio
Para insertar un nodo al inicio de la lista, creamos un nuevo nodo y ajustamos los punteros adecuadamente.
subroutine insertAtBeginning(head, newValue)
type(Node), pointer :: head
integer, intent(in) :: newValue
type(Node), pointer :: newNode
allocate(newNode)
newNode%value = newValue
newNode%next = head
head = newNode
end subroutine insertAtBeginningInsertar un Nodo al Final
Para insertar un nodo al final de la lista, recorremos la lista hasta encontrar el último nodo y luego ajustamos los punteros.
subroutine insertAtEnd(head, newValue)
type(Node), pointer :: head
integer, intent(in) :: newValue
type(Node), pointer :: newNode, current
allocate(newNode)
newNode%value = newValue
newNode%next = null()
if (.not. associated(head)) then
head = newNode
else
current = head
do while (associated(current%next))
current = current%next
end do
current%next = newNode
end if
end subroutine insertAtEndEliminar un Nodo
Para eliminar un nodo, necesitamos ajustar los punteros para excluir el nodo deseado de la lista.
subroutine deleteNode(head, valueToDelete)
type(Node), pointer :: head
integer, intent(in) :: valueToDelete
type(Node), pointer :: current, previous
current = head
previous => null()
do while (associated(current) .and. current%value /= valueToDelete)
previous = current
current = current%next
end do
if (associated(current)) then
if (associated(previous)) then
previous%next = current%next
else
head = current%next
end if
deallocate(current)
end if
end subroutine deleteNodeEjercicio Práctico
Ejercicio 1: Implementar una Lista Enlazada
- Objetivo: Implementar una lista enlazada en Fortran que permita insertar nodos al inicio y al final, y eliminar nodos por valor.
- Instrucciones:
- Define el tipo derivado
Node. - Implementa las subrutinas
insertAtBeginning,insertAtEndydeleteNode. - Escribe un programa principal que pruebe estas subrutinas.
- Define el tipo derivado
Solución
program linkedListExample
implicit none
type :: Node
integer :: value
type(Node), pointer :: next => null()
end type Node
type(Node), pointer :: head => null()
call insertAtBeginning(head, 10)
call insertAtBeginning(head, 20)
call insertAtEnd(head, 30)
call deleteNode(head, 20)
call printList(head)
contains
subroutine insertAtBeginning(head, newValue)
type(Node), pointer :: head
integer, intent(in) :: newValue
type(Node), pointer :: newNode
allocate(newNode)
newNode%value = newValue
newNode%next = head
head = newNode
end subroutine insertAtBeginning
subroutine insertAtEnd(head, newValue)
type(Node), pointer :: head
integer, intent(in) :: newValue
type(Node), pointer :: newNode, current
allocate(newNode)
newNode%value = newValue
newNode%next = null()
if (.not. associated(head)) then
head = newNode
else
current = head
do while (associated(current%next))
current = current%next
end do
current%next = newNode
end if
end subroutine insertAtEnd
subroutine deleteNode(head, valueToDelete)
type(Node), pointer :: head
integer, intent(in) :: valueToDelete
type(Node), pointer :: current, previous
current = head
previous => null()
do while (associated(current) .and. current%value /= valueToDelete)
previous = current
current = current%next
end do
if (associated(current)) then
if (associated(previous)) then
previous%next = current%next
else
head = current%next
end if
deallocate(current)
end if
end subroutine deleteNode
subroutine printList(head)
type(Node), pointer :: head
type(Node), pointer :: current
current = head
do while (associated(current))
print *, current%value
current = current%next
end do
end subroutine printList
end program linkedListExampleConclusión
En esta sección, hemos aprendido a implementar listas enlazadas en Fortran utilizando tipos derivados y punteros. Hemos cubierto cómo insertar nodos al inicio y al final de la lista, así como cómo eliminar nodos por valor. Estas operaciones son fundamentales para manipular listas enlazadas y son la base para estructuras de datos más complejas.
En el siguiente módulo, exploraremos el manejo de archivos en Fortran, lo que nos permitirá leer y escribir datos desde y hacia archivos, una habilidad esencial para muchos programas científicos y de ingeniería.
Curso de Programación en Fortran
Módulo 1: Introducción a Fortran
- Introducción a Fortran
- Configuración del Entorno de Desarrollo
- Sintaxis y Estructura Básica
- Escribiendo tu Primer Programa en Fortran
Módulo 2: Conceptos Básicos
- Variables y Tipos de Datos
- Operadores y Expresiones
- Entrada y Salida
- Estructuras de Control: Sentencias If
- Estructuras de Control: Bucles
Módulo 3: Arreglos y Cadenas
- Introducción a los Arreglos
- Arreglos Multidimensionales
- Manejo de Cadenas
- Operaciones con Arreglos y Cadenas
Módulo 4: Procedimientos y Funciones
Módulo 5: Estructuras de Datos Avanzadas
Módulo 6: Manejo de Archivos
- Lectura de Archivos
- Escritura de Archivos
- Posicionamiento de Archivos
- Operaciones con Archivos Binarios
Módulo 7: Temas Avanzados
Módulo 8: Mejores Prácticas y Optimización
- Técnicas de Optimización de Código
- Depuración y Perfilado
- Escribiendo Código Mantenible
- Estándares y Portabilidad de Fortran
