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) 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) 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
Top Related