Docente: Giuseppe Scollo
Università di Catania, sede di Comiso (RG)
Facoltà di Scienze Matematiche, Fisiche e Naturali
Corso di Studi in Informatica applicata, AA 2006-7
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)