• Non ci sono risultati.

Liste doppiamente collegate

N/A
N/A
Protected

Academic year: 2021

Condividi "Liste doppiamente collegate"

Copied!
11
0
0

Testo completo

(1)

Liste

Corso di algoritmi

Giuseppe Lipari

Scuola Superiore Sant’Anna Pisa -Italy

Liste – p. 1/9

(2)

Liste doppiamente collegate

Si tratta di liste di oggetti lineari.

Ogni elemento della lista mantiene un puntatore sia all’elemento precedente che all’elemento successivo nella lista.

Per questo motivo si parla di liste doppiamente collegate (in inglese: double linked lists).

Il doppio puntatore serve a facilitare le operazioni di scorrimento degli elementi. Inoltre permette con complessità unitaria sia

l’inserimento in testa che in coda alla lista.

(3)

Struttura del nodo

struct dll_node { void d;

struct dll_node next;

struct dll_node prev;

};

typedef struct dll_node DLL_NODE;

pointer to next node

void *d pointer to data

next prev

pointer to previous node

Liste – p. 3/9

(4)

Esempio di lista

supponiamo che la lista contenga gli elementi (3, 7, -1);

struct dllist { DLL_NODE head;

DLL_NODE tail;

};

typedef struct dllist DLLIST;

tail head

0 0

−1 7

3

(5)

Inserimento di un elemento

Inizialmente la lista è vuota. Inseriamo in testa il primo elemento.

head tail

0

0

Liste – p. 5/9

(6)

Inserimento di un elemento - II

void dll_insert_head(DLLIST l, DLL_NODE p) {

p>next = l>head;

if (l>head != 0) l>head>prev = p;

else l>tail = p;

p>prev = 0;

l>head = p;

}

0 head

tail

0

0

3

(7)

Inserimento di un elemento - III

void dll_insert_head(DLLIST l, DLL_NODE p) {

p>next = l>head;

if (l>head != 0) l>head>prev = p;

else l>tail = p;

p>prev = 0;

l>head = p;

}

0 head

tail

3

Liste – p. 7/9

(8)

Inserimento in coda

void dll_insert_tail(DLLIST l, DLL_NODE p) {

p>next = 0;

p>prev = l>tail;

if (l>tail != 0) l>tail>next = p;

else l>head = p;

l>tail = p;

}

tail head

0

7 3

0

(9)

Complessit `a delle operazioni

Inserimento in testa o in coda: O(1)

Inserimento in lista ordinata: O(n)

Ricerca elemento: O(n)

Liste – p. 9/9

(10)

Indipendenza dal tipo di oggetto

Il nodo in questione contiene come dato un puntatore a un dato di tipo non specificato (void *).

Questo metodo ha due vantaggi:

1. E’ indipendente da tipo di dato: possiamo inserire in coda

qualunque tipo di dato, da molto semplice a molto complesso;

2. Poichè il dato esiste già (nella lista inseriamo solo il puntatore), è possibile inserire uno stesso dato in più liste indipendenti.

Lo svantaggio principale è:

se abbiamo un puntatore all’oggetto, è impossibile risalire alla lista che lo contiene.

(11)

Codice sorgente

Nel pacchetto, il codice per implementare una Double Linked List si trova nei file include/list.h e src/list.c.

Come sempre, nel file header si trova l’interfaccia del modulo, e va incluso da qualunque altro modulo voglia utilizzare delle dll.

Ecco le funzioni offerte dal modulo (la documentazione si trova in code/docs/html/index.html).

DLL_NODE dll_create_node(void data);

DLLIST dll_create_list(void);

void dll_insert_head(DLLIST l, DLL_NODE pnode);

void dll_insert_tail(DLLIST l, DLL_NODE pnode);

DLL_NODE dll_extract_head(DLLIST l);

DLL_NODE dll_extract_tail(DLLIST l);

DLL_NODE dll_find_elem(DLLIST l, void d, PCOMPFUNC pf);

void dll_free_node_all(DLL_NODE p);

void dll_free_node(DLL_NODE p);

void dll_free_list_all(DLLIST p);

void dll_free_list(DLLIST p);

Liste – p. 11/9

Riferimenti

Documenti correlati

LISTA CONFERME - GRADUATORIE DEGLI AMMESSI E LISTE DI ATTESA.

Comune di Civitavecchia.

III Alessandro Battilocchio III.A Fratelli d’Italia Giorgia Meloni III.B Forza Italia Berlusconi Presidente III.C Noi con l’Italia - UDC. III.D Lega

2 Mariana Lina Altamira 2.1 Partito Repubblicano Italiano Ala 3 Corina Constantinescu 3.1 Lista del Popolo per la Costituzione 4 Alessandro Mazzoli 4.1 Italia Europa

Dall’altra, la stessa Costituzione Dogmatica sulla Chiesa, Lum en Gentium, parlando dell’azione dello Spirito santificatore nella vita della Chiesa, afferm a che «con la

[r]

[r]

Gli enti, le aziende e le strutture pubbliche e private che erogano prestazioni per conto del servizio sanitario sono tenuti ad indicare nel proprio sito, in una apposita