le strutture dati elementari (ii parte) -...

35
Le strutture dati elementari (II parte) Gianpiero Cabodi Dip. Automatica e Informatica Politecnico di Torino

Upload: hoangdien

Post on 18-Feb-2019

229 views

Category:

Documents


0 download

TRANSCRIPT

Le strutture dati elementari(II parte)

Gianpiero CabodiDip. Automatica e Informatica

Politecnico di Torino

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 2

Nodo/* tipo per il dato in lista */typedef ... Item;

/* nodo contenente dato e link */typedef struct node *link;struct node {Item item;link next;

}

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 3

Operazioni

link x;...

Allocazione nodo xx = malloc(sizeof *x);

oppurex = malloc(sizeof(struct node));

x

item next

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 4

link x, t;...Inserire nodo t dopo x in lista concatenata semplice

t

x

x->next

t->next

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 5

t->next = x->next;

t

x

t->next

x->next

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 6

x->next = t;

t

x

x->next

t->next

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 7

t

x

link x, t;...Cancellare il nodo dopo x in lista concatenata semplice

x->next

t->nextossiax->next->next

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 8

tx

x->next = x->next->next;

x->next

x->next->next;

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 9

link x, t;...Inserire nodo t dopo x in lista concatenata doppia

t

x

x->next

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 10

t->next = x->next;

t

x

x->next

t->next

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 11

x->next->prev = t;

t

x

x->next

t->nextx->next->prev

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 12

x->next = t;

t

xx->next

t->next

x->next->prev

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 13

t->prev = x;

t

xx->next

t->next

x->next->prev

t->prev

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 14

link t;...Cancellare nodo t in lista concatenata doppia

t

t->next

t->prev

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 15

t->next->prev = t->prev;

t

t->next

t->prev

t->next->prev

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 16

t->prev->next = t->next;

tt->next

t->prev

t->next->prev

t->prev->next

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 17

Il problema di Giuseppe Flavio

N oggetti sono disposti in cerchioSi elimina un oggetto ogni M e si richiude il

cerchioQuale oggetto rimane per ultimo? Con quale

ordine si eliminano gli oggetti?

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 18

ImplementazioneLista circolareogni oggetto connesso a quello

immediatamente a SXi = i-esimo oggettocreazione della lista di N oggetti per

inserzionepartendo da 1, contare M-1 oggetticonnettere l’M-1-esimo oggetto con l’M+1-

esimo, saltando l’M-esimoterminazione: 1 solo oggetto rimanente.

987654321

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 19

Inversione di listar: puntatore alla porzione di lista già

invertita (ultimo nodo già sistemato)y: puntatore alla porzione di lista da

invertire (primo nodo ancora da sistemare)t: puntatore al nodo successivo al primo

nodo ancora da sistemare (puntato da y)

r

yt

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 20

Operazioni:cambiare il link di y in modo che punti a r avanzamento: spostiamo r su y e y su t

ry

t

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 21

Inizialmente:y = x (la lista è ancora tutta da invertire)r = NULL (la lista già invertita è vuota)condizione di loop: esiste ancora una

porzione da invertire y != NULL

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 22

Insertion sort su listaInput: lista non ordinata contenente N

numeri casualiOutput: lista ordinata ottenuta mediante

insertion sortLista:

con nodo fittizio in testa (head node), non contiene dato, solo link al primo nodo significativo della lista

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 23

Rappresentazioni convenzionali

lista circolare mai vuotapuntatore in testa, coda a NULLnodo fittizio in testa, coda a NULLnodi fittizi in testa e in coda.

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 24

Lista circolare, mai vuota

primo inserimento head->next = head

inserisci t dopo x t->next = x->next;x->next = t

cancella dopo x x->next = x->next->next

ciclo di t = head

attraversamento do { … t = t->next; }while (t != head);

testa se un solo if (head->next == head)

elemento

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 25

Puntatore in testa, coda a NULL

inizializza head = NULL

inserisci t dopo x if (head == NULL){head = t;head->next = NULL;}

else {t->next = x->next;x->next = t;}

cancella dopo x t = x->next; x->next = t->next;

ciclo di for (t = head; t != NULL;

attraversamento t = t->next )

testa se vuota if (head == NULL)

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 26

Nodo fittizio in testa, coda vuota

inizializza head = malloc(sizeof *head);

head->next = NULL;

inserisci t dopo x t->next = x->next; x->next = t;

cancella dopo x t = x->next; x->next = t->next;

ciclo di for (t = head->next;t != NULL;

attraversamento t = t->next )

testa se vuota if (head->next == NULL)

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 27

Nodi fittizi in testa e in coda

inizializza head = malloc(sizeof *head);z = malloc(sizeof *z);head->next = z;

z->next = z;

inserisci t dopo x t->next = x->next; x->next = t;

cancella dopo x x->next = x->next->next;

ciclo di for (t = head->next; t != z;

attraversamento t = t->next; )

testa se vuota if (head->next == z)

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 28

Interfaccia per liste

InterfacciaImplementazioneClient (Giuseppe Flavio)

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 29

Stringhe

Importanza DefinizioneImplementazionecon array

Funzioni di libreriaStringhe e allocazione di memoria

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 30

Operazioni su stringhe(con array e puntatori)

strlen(a): calcolo lunghezzafor (i=0; a[i]!=’\0’; i++);return i;b=a; while(*b++); return b-a-1;

strcpy(a,b): copiafor (i=0; (a[i]=b[i])!=’\0’; i++);while(*a++=*b++);

Nota: siccome il codice ASCII di ’\0’ è 0, spesso si usa direttamente 0 come terminatore di stringa

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 31

strcmp(a,b): confrontafor (i=0; a[i]==b[i]; i++)if (a[i]==0) return 0;

return a[i]-b[i];while(*a++ == *b++)if (*(a-1) == 0) return 0;

return *(a-1) - *(b-1);

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 32

Confronto tra puntatori

if (a==b)

eif (strcmp(a,b)==0)

hanno due significati diversi:confronto tra due puntatori a stringheconfronto tra i contenuti di due stringhe

Ovviamente (a==b)(puntatori coincidenti) implica contenuti identici, ma il viceversa è falso.

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 33

Ricerca su stringhe

Problema: trovare tutte le occorrenze di una sottostringa p in una stringa aSoluzione: doppia iterazione annidata

per ogni carattere a[i] di averifica se a[i] è inizio di una sottostringa uguale a p

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 34

Stringhe e allocazione di memoria

Problemale stringhe hanno dimensione variabile.Prima di effettuare operazioni che costruiscono (es. strcpy) o allungano (es. strcat) stringhe, occorre assicurarsi che ci sia memoria allocata sufficiente

A.A. 2006/2007 03 Le strutture dati elementari (II parte) 35

SoluzioneUso di malloc e freeÈ necessario controllare la dimensione di un array prima di generarvi una stringa. Eventualmente riallocare. Tale gestione può risultare poco trasparente.