01.06.2013 Views

1 - Amiga Magazine Online

1 - Amiga Magazine Online

1 - Amiga Magazine Online

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

ADDHEAD(lista,nodo)<br />

ADDTAIL(lista,nodo)<br />

INSERT(lista,nodo,prec)<br />

nodo = FEMHEAD(lista,tipo)<br />

nodo = REMTAIL(lista,tipo)<br />

REMOVE(nodo)<br />

ENQUEUE(lista,nodo)<br />

nodo = FINDNAME(lista,nome,tipo)<br />

TabeUa l - Macro di 1iste.h e funzioni di Exec.<br />

AddHead<br />

AddTail<br />

Insert<br />

RemHead<br />

RemTail<br />

Remove<br />

Enqueue<br />

FindName<br />

Sul disco allegato ad <strong>Amiga</strong> <strong>Magazine</strong> troverete il file li-<br />

ste.h, contenente un insieme di macro che semplifica<br />

l'uso delle liste.<br />

I1 primo gruppo di macro ricalca le funzioni di Exec e si<br />

occupa esclusivamente di eseguire i cast; potete fare rife-<br />

rimento alla tabella 1 per le corrispondenze (ovvie, visti i<br />

nomi!) tra macro e funzioni, tenendo presente che il<br />

comportamento di ogni macro è analogo a quello della<br />

relativa funzione. Notiamo che le macro che restituiscono<br />

un puntatore hanno un argomento in più rispetto alla<br />

corrispondente funzione: si tratta del tipo del nodo da<br />

noi definito.<br />

I1 secondo gruppo di macro è riassunto in tabella 2, ove<br />

compare anche una breve descrizione del loro significa-<br />

INITLIST(1ista) Inizializza la lista prima dell'uso<br />

ISEMPTY(1ista) Verifica se la lista è vuota<br />

ISHEAD(nod0) Verifica se il nodo è il nodo fittizio di testa<br />

ISTAIL(nod0) Verifica se il nodo è il nodo fittizio di coda<br />

ISFIRST(nodo) Verifica se il nodo è il primo della lista<br />

ISLAST(nodo) Verifica se il nodo è l'ultimo della lista<br />

Qualche esempio<br />

Per creare una lista si dovrà anzitutto dichiarare una va-<br />

riabile di tipo struct Text, che sarà I'header della lista.<br />

Come si può vedere dalla figura lb, anche quando la li-<br />

sta è vuota, i campi dell'header devono essere opportu-<br />

namente inizializzati. Pertanto, prima di qualunque altra<br />

operazione, è necessario utilizzare la macro INITLIST( ).<br />

Questa macro è analoga alla funzione NewList( ) conte-<br />

nuta nella libreria linked amiga.lib.<br />

Dal momento che la tecnica d'uso delle liste è basata<br />

sull'allocazione dinamica della memoria, prima di inserire<br />

un nuovo elemento si dovrà provvedere ad allocare la<br />

giusta quantità di memoria ed eventualmente a inizializ-<br />

zarne i campi relativi alla nostra applicazione.<br />

Viceversa, dopo la rimozione di un elemento da una li-<br />

sta, si dovrà rilasciare la memoria da esso occupata, se è<br />

nostra intenzione "distruggerlo"; altrimenti potrà essere<br />

inserito in un'altra lista (o nella stessa lista in un'altra po-<br />

sizione) o mantenuto isolato.<br />

Vi suggeriamo di scrivere delle funzioni per la creazione<br />

e la distruzione degli elementi della lista, prendendo<br />

spunto da quelle che trovate nel file di esempio 1iste.c.<br />

I1 seguente frammento di programma (di dubbia utilità!):<br />

struct Text testo;<br />

struct Line *lineal, *linea2;<br />

struct Line *linea;<br />

// Allocazione dinamica delle linee<br />

. . .<br />

nodo = HEAD(lista,tipo) Restituisce il primo nodo della lista<br />

nodo = TAIL(lista,tipo) Restituisce l'ultimo nodo della lista<br />

nodo = SUCC(nodo,tipo) Restituisce il nodo successore<br />

nodo = PRED(nodo,tipo) Restituisce il nodo predecessore<br />

TabeUa 2 - Altre macro di iiste.h.<br />

I 1<br />

I<br />

// Rilascio della memoria allocata<br />

...<br />

inizializza una lista, inserisce lineal in testa e linea2 in<br />

coda, quindi estrae l'elemento che si trova in testa, assegnandone<br />

- l'indirizzo a linea (abbiamo omesso il codice<br />

relativo alla creazione dinamica e al rilascio delle due<br />

struct Line alle quali devono puntare linea1 e linea2).

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!