Les llistes enllaçades són una estructura de dades fonamental que permet emmagatzemar una col·lecció d'elements de manera dinàmica. A diferència dels arrays, les llistes enllaçades no requereixen una mida fixa i poden créixer o disminuir segons sigui necessari. En aquest tema, aprendrem com crear i gestionar llistes enllaçades en Fortran.
Continguts
- Introducció a les Llistes Enllaçades
- Definició d'un Node
- Creació d'una Llista Enllaçada
- Inserció d'Elements
- Eliminació d'Elements
- Recórrer una Llista Enllaçada
- Exercicis Pràctics
- Introducció a les Llistes Enllaçades
Una llista enllaçada és una col·lecció de nodes on cada node conté un element de dades i un punter al següent node de la llista. Les llistes enllaçades poden ser de diversos tipus:
- Llista enllaçada simple: Cada node apunta al següent node.
- Llista enllaçada doble: Cada node apunta tant al següent com al node anterior.
- Llista enllaçada circular: L'últim node apunta al primer node, formant un cercle.
- Definició d'un Node
En Fortran, podem definir un node utilitzant tipus derivats. Un node típic per a una llista enllaçada simple es defineix de la següent manera:
- Creació d'una Llista Enllaçada
Per crear una llista enllaçada, necessitem inicialitzar el primer node (capçalera) de la llista. Aquí teniu un exemple de com fer-ho:
program LinkedListExample
implicit none
type(Node), pointer :: head
! Inicialitzem la capçalera de la llista
allocate(head)
head%data = 10
head%next => null()
print *, 'Primer node creat amb valor: ', head%data
end program LinkedListExample
- Inserció d'Elements
Per inserir un nou element a la llista, hem de crear un nou node i ajustar els punters adequadament. Aquí teniu un exemple d'inserció al principi de la llista:
subroutine insertAtBeginning(head, value)
type(Node), pointer :: head
integer, intent(in) :: value
type(Node), pointer :: newNode
allocate(newNode)
newNode%data = value
newNode%next => head
head => newNode
end subroutine insertAtBeginning
- Eliminació d'Elements
Per eliminar un element de la llista, hem de trobar el node a eliminar i ajustar els punters dels nodes adjacents. Aquí teniu un exemple d'eliminació del primer element:
subroutine deleteFirst(head)
type(Node), pointer :: head
type(Node), pointer :: temp
if (associated(head)) then
temp => head
head => head%next
deallocate(temp)
end if
end subroutine deleteFirst
- Recórrer una Llista Enllaçada
Per recórrer una llista enllaçada, podem utilitzar un bucle que segueixi els punters fins arribar al final de la llista. Aquí teniu un exemple:
subroutine traverseList(head)
type(Node), pointer :: head
type(Node), pointer :: current
current => head
do while (associated(current))
print *, 'Node value: ', current%data
current => current%next
end do
end subroutine traverseList
- Exercicis Pràctics
Exercici 1: Inserció al Final de la Llista
Escriu una subrutina insertAtEnd que insereixi un nou node al final de la llista.
Exercici 2: Cerca en la Llista
Escriu una subrutina searchList que cerqui un valor específic en la llista i retorni si el valor es troba o no.
Exercici 3: Eliminació d'un Element Específic
Escriu una subrutina deleteValue que elimini un node amb un valor específic de la llista.
Solucions
Solució a l'Exercici 1
subroutine insertAtEnd(head, value)
type(Node), pointer :: head
integer, intent(in) :: value
type(Node), pointer :: newNode, current
allocate(newNode)
newNode%data = value
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 insertAtEndSolució a l'Exercici 2
logical function searchList(head, value)
type(Node), pointer :: head
integer, intent(in) :: value
type(Node), pointer :: current
current => head
searchList = .false.
do while (associated(current))
if (current%data == value) then
searchList = .true.
return
end if
current => current%next
end do
end function searchListSolució a l'Exercici 3
subroutine deleteValue(head, value)
type(Node), pointer :: head
integer, intent(in) :: value
type(Node), pointer :: current, previous
current => head
previous => null()
do while (associated(current))
if (current%data == value) then
if (associated(previous)) then
previous%next => current%next
else
head => current%next
end if
deallocate(current)
return
end if
previous => current
current => current%next
end do
end subroutine deleteValueConclusió
Les llistes enllaçades són una eina poderosa per gestionar col·leccions de dades de manera dinàmica. Hem après a definir nodes, crear llistes, inserir i eliminar elements, i recórrer la llista. Amb aquests coneixements, estàs preparat per abordar problemes més complexos que requereixin estructures de dades dinàmiques en Fortran.
Curs de Programació en Fortran
Mòdul 1: Introducció a Fortran
- Introducció a Fortran
- Configuració de l'Entorn de Desenvolupament
- Sintaxi i Estructura Bàsiques
- Escrivint el teu Primer Programa en Fortran
Mòdul 2: Conceptes Bàsics
- Variables i Tipus de Dades
- Operadors i Expressions
- Entrada i Sortida
- Estructures de Control: Sentències If
- Estructures de Control: Bucles
Mòdul 3: Arrays i Cadenes
Mòdul 4: Procediments i Funcions
Mòdul 5: Estructures de Dades Avançades
Mòdul 6: Gestió de Fitxers
Mòdul 7: Temes Avançats
Mòdul 8: Millors Pràctiques i Optimització
- Tècniques d'Optimització de Codi
- Depuració i Perfilat
- Escrivint Codi Mantenible
- Estàndards i Portabilitat de Fortran
