Les estructures de dades dinàmiques són fonamentals en la programació, ja que permeten gestionar dades de manera flexible i eficient. En aquest tema, explorarem com treballar amb estructures de dades dinàmiques en ALGOL, incloent l'ús de punteres, l'assignació dinàmica de memòria i la implementació de llistes enllaçades.
Continguts
Introducció a les Estructures de Dades Dinàmiques
Les estructures de dades dinàmiques permeten que la mida de les dades canviï durant l'execució del programa. Això és especialment útil quan no es coneix la mida de les dades en temps de compilació. Les estructures de dades dinàmiques més comunes inclouen:
- Llistes enllaçades
- Piles
- Cues
- Arbres
- Grafos
Punteres i Memòria Dinàmica
Punteres
Un punter és una variable que emmagatzema l'adreça de memòria d'una altra variable. En ALGOL, els punteres es poden utilitzar per crear estructures de dades dinàmiques.
Assignació Dinàmica de Memòria
L'assignació dinàmica de memòria permet reservar espai en memòria durant l'execució del programa. En ALGOL, això es pot fer utilitzant la funció new.
Exemple de Punteres i Assignació Dinàmica
begin
integer pointer p;
integer array a;
p := new integer;
a := new integer array (1:10);
p^ := 5;
a[1] := 10;
print(p^); ! Imprimeix 5
print(a[1]); ! Imprimeix 10
dispose(p);
dispose(a);
endEn aquest exemple, p és un punter a un enter i a és un punter a un array d'enters. Utilitzem new per assignar memòria dinàmica i dispose per alliberar-la.
Llistes Enllaçades
Definició
Una llista enllaçada és una col·lecció de nodes on cada node conté un valor i un punter al següent node de la llista. Les llistes enllaçades poden ser simples, dobles o circulars.
Implementació d'una Llista Enllaçada Simple
begin
record node = (integer value; node pointer next);
node pointer head, temp;
head := new node;
head.value := 1;
head.next := new node;
head.next.value := 2;
head.next.next := new node;
head.next.next.value := 3;
head.next.next.next := nil;
temp := head;
while temp != nil do
begin
print(temp.value);
temp := temp.next;
end;
! Alliberar memòria
temp := head;
while temp != nil do
begin
node pointer nextNode;
nextNode := temp.next;
dispose(temp);
temp := nextNode;
end;
endEn aquest exemple, creem una llista enllaçada simple amb tres nodes. Cada node conté un valor enter i un punter al següent node. Després, recorrem la llista per imprimir els valors i finalment alliberem la memòria.
Exercicis Pràctics
Exercici 1: Crear una Llista Enllaçada
Crea una llista enllaçada que contingui els valors 10, 20, 30, 40 i 50. Imprimeix els valors de la llista.
Solució
begin
record node = (integer value; node pointer next);
node pointer head, temp;
head := new node;
head.value := 10;
head.next := new node;
head.next.value := 20;
head.next.next := new node;
head.next.next.value := 30;
head.next.next.next := new node;
head.next.next.next.value := 40;
head.next.next.next.next := new node;
head.next.next.next.next.value := 50;
head.next.next.next.next.next := nil;
temp := head;
while temp != nil do
begin
print(temp.value);
temp := temp.next;
end;
! Alliberar memòria
temp := head;
while temp != nil do
begin
node pointer nextNode;
nextNode := temp.next;
dispose(temp);
temp := nextNode;
end;
endExercici 2: Inserir un Node en una Llista Enllaçada
Modifica la llista enllaçada de l'exercici anterior per inserir un node amb el valor 25 després del node amb el valor 20.
Solució
begin
record node = (integer value; node pointer next);
node pointer head, temp, newNode;
head := new node;
head.value := 10;
head.next := new node;
head.next.value := 20;
head.next.next := new node;
head.next.next.value := 30;
head.next.next.next := new node;
head.next.next.next.value := 40;
head.next.next.next.next := new node;
head.next.next.next.next.value := 50;
head.next.next.next.next.next := nil;
! Inserir el node amb valor 25
temp := head;
while temp != nil do
begin
if temp.value = 20 then
begin
newNode := new node;
newNode.value := 25;
newNode.next := temp.next;
temp.next := newNode;
break;
end;
temp := temp.next;
end;
temp := head;
while temp != nil do
begin
print(temp.value);
temp := temp.next;
end;
! Alliberar memòria
temp := head;
while temp != nil do
begin
node pointer nextNode;
nextNode := temp.next;
dispose(temp);
temp := nextNode;
end;
endConclusió
En aquest tema, hem après sobre les estructures de dades dinàmiques en ALGOL, incloent l'ús de punteres i l'assignació dinàmica de memòria. També hem implementat una llista enllaçada simple i hem practicat la inserció de nodes en una llista enllaçada. Aquestes habilitats són fonamentals per gestionar dades de manera flexible i eficient en els programes.
En el següent mòdul, explorarem temes avançats com la gestió d'arxius i la gestió de memòria en profunditat.
Curs de Programació en ALGOL
Mòdul 1: Introducció a ALGOL
Mòdul 2: Sintaxi i Estructura Bàsica
- Estructura del Programa ALGOL
- Variables i Tipus de Dades
- Entrada i Sortida Bàsica
- Operadors i Expressions
Mòdul 3: Estructures de Control
Mòdul 4: Funcions i Procediments
- Definició de Funcions
- Paràmetres de Funció i Valors de Retorn
- Funcions Recursives
- Procediments en ALGOL
Mòdul 5: Estructures de Dades
Mòdul 6: Temes Avançats
Mòdul 7: Aplicacions Pràctiques
- Mètodes Numèrics
- Implementació d'Algorismes
- Construcció d'un Compilador Simple
- Estudis de Cas i Projectes
