Docente: Giuseppe Scollo
Università di Catania, sede di Comiso (RG)
Facoltà di Scienze Matematiche, Fisiche e Naturali
Corso di Studi in Informatica applicata, AA 2007-8
come si è visto nella lezione precedente, allocazione e rilascio
della memoria per ciascun nodo di una lista concatenata possono
effettuarsi invocando le funzioni di libreria new e delete, rispettivamente
negli algoritmi in cui si eseguono spesso operazioni di inserimento e rimozione di nodi in una lista, può risultare conveniente preallocare una quantità di memoria sufficiente, e quindi gestire localmente la memoria associata a tali operazioni, trasferendo i nodi fra la lista in gioco e la lista libera, cioè una lista di nodi disponibili per l'allocazione locale
con riferimento all'interfaccia Lista.h proposta nella lezione precedente:
construct
newNode e deleteNode, rispettivamente
per implementare in C++ l'interfaccia Lista.h con gestione locale della memoria, come indicato sopra, si possono adottare le seguenti scelte:
N nodi è realizzata mediante un array di
N+1 nodi, in quanto
0 nell'array) e con
valore nullo del puntatore nel nodo di coda
Lista.c++ :
#include <cstdlib>
#include "Lista.h"
nlink freelist;
void construct(int N)
{ freelist = new node[N+1];
for (int i = 0; i < N; i++)
freelist[i].next = &freelist[i+1];
freelist[N].next = 0;
}
nlink newNode(Elem e)
{ nlink x = remove(freelist);
x->elem = e; x->next = x; return x;
}
void deleteNode(nlink x)
{ insert(freelist, x); }
void insert(nlink x, nlink t)
{ t->next = x->next; x->next = t; }
nlink remove(nlink x)
{ nlink t = x->next; x->next = t->next; return t; }
nlink next(nlink x) { return x->next; }
Elem elem(nlink x) { return x->elem; }
newNode qui proposta per evitare l'errore in cui incorre se il
client
la invoca quando la lista libera è vuota
new e delete risp. in newNode e deleteNode
<comando> è un comando eseguibile (inclusi eventuali
parametri da linea di comando), allora time <comando> lo esegue e, al termine della sua esecuzione,
ne fornisce misure di tempo di esecuzione (quella rilevante all'esercizio
è usr+sys, si consulti man time per dettagli)