Handouts 4
Handouts 4
USE
This material (including video recording) is intended solely for students of the University of Trento
registered to the relevant course for the Academic Year 2021-2022.
SELF-STORAGE
Self-storage is permitted only for the students involved in the relevant courses of the University of
Trento and only as long as they are registered students. Upon the completion of the studies or their
abandonment, the material has to be deleted from all storage systems of the student.
COPYRIGHT
The copyright of all the material is held by the authors. Copying, editing, translation, storage,
processing or forwarding of content in databases or other electronic media and systems without
written consent of the copyright holders is forbidden. The selling of (parts) of this material is
forbidden. Presentation of the material to students not involved in the course is forbidden. The
unauthorised reproduction or distribution of individual content or the entire material is not permitted
and is punishable by law.
Una lista concatenata è un insieme di oggetti, dove ogni oggetto è inserito in un nodo
contenente anche un link ad un altro nodo.
dato
Punta ad un link nullo che non punta a nessun nodo (e.g. <val> = NULL)
Punta ad un nodo fittizio che non contiene alcun nodo (e.g. <val> = (nodo *)300)
Punta indietro al primo elemento della lista, creando una lista circolare
head
Elemento 1 Elemento 2 Elemento 3
s El 1 El 2 El 3 El 4 El 5 NULL
s L=0
s L=1
s L=2
s L=3
s L=4
s L=5
Per inserire un nodo t in una lista concatenata nella posizione successiva a quella
occupata da un dato nodo x, poniamo t->next a x->next, e quindi x->next a t.
x x
1 2 3 NULL 1 2 3 NULL
4 NULL 4
t t
x
1 2 3 NULL
t
© Marco Roveri et al. Cap. 11: Liste Concatenate 15 novembre 2021 9
Inserimento di un elemento (II)
t->next inizializzato a x->next
x->next inizializzato a t
p 1 13 2 67 NULL
q->next = p;
q 26
p 1 13 2 67 NULL
p = q;
q 26
p 1 13 2 NULL node *q = p;
while(q->next != NULL)
q q = q->next;
p 1 13 2
q->next = new node;
q
p 1 13 2 26 NULL
q->next->dato = 26;
q q->next->next = NULL;
Nota:
Questo ragionamento è corretto solo se la lista non è vuota!!!
© Marco Roveri et al. Cap. 11: Liste Concatenate 15 novembre 2021 15
Inserimento di un elemento in coda (II)
void insert_last(nodo * & p, int n) {
nodo * r = new nodo; Allocazione del nuovo nodo
r->dato = n;
r->next = NULL; Se la lista non è vuota, cerco in q il
if (p != NULL) { puntatore all’ultimo elemento
node * q = p;
while(q->next != NULL) { q è garantito essere diverso da
NULL
q = q->next;
}
q->next = r; Memorizzo in q->next il nuovo
} nodo r allocato in precedenza
else {
p = r; Se la lista è vuota, p punta al nuo-
} vo nodo allocato: p è passato per
} riferimento
p 3 16 32 NULL node *q = p;
while(q->next->dato <= 26)
q q = q->next;
p 3 16 32 NULL
q->next = r;
q r 26
Nota:
Devono essere considerati alcuni casi limite!!!
© Marco Roveri et al. Cap. 11: Liste Concatenate 15 novembre 2021 17
Inserimento di un elemento in lista ordinata (II)
p 3 16 NULL node *q = p;
while(q->next != NULL &&
q->next->dato <= 26)
q q = q->next;
Per rimuovere un nodo y in una lista concatenata nella posizione successiva a quella
occupata da un dato nodo x, cambiamo x->next a y->next.
x y x
1 2 3 NULL 1 3 NULL
2 NULL
y inizializzato a x->next
p
1 13 2 67 NULL node *q = p;
q
p
1 13 2 67 NULL p = p->next;
q
p
13 2 67 NULL delete q;
q NULL
Nota:
Il nodo rimosso deve essere deallocato!!!
Si vuole cercare un nodo che contiene nel campo dato un valore ed eliminarlo!
p 1 2 26 13 NULL
nodo* q=p;
q
while(q->next!=NULL){
if(q->next->dato==26){
}
q=q->next;
}
Si vuole cercare un nodo che contiene nel campo dato un valore ed eliminarlo!
p 1 2 26 13 NULL
nodo* q=p;
q
p 1 2 26 13 NULL while(q->next!=NULL){
if(q->next->dato==26){
q r node *r = q->next;
}
q=q->next;
}
Si vuole cercare un nodo che contiene nel campo dato un valore ed eliminarlo!
p 1 2 26 13 NULL
nodo* q=p;
q
p 1 2 26 13 NULL while(q->next!=NULL){
if(q->next->dato==26){
q r node *r = q->next;
q->next = q->next->next;
}
q=q->next;
}
Si vuole cercare un nodo che contiene nel campo dato un dato valore ed eliminarlo!
p 1 2 26 13 NULL
nodo* q=p;
q
p 1 2 26 13 NULL while(q->next!=NULL){
if(q->next->dato==26){
q r node *r = q->next;
q->next = q->next->next;
p 1 2 13 NULL delete r;
q NULL r }
q=q->next;
}
Si vuole cercare un nodo che contiene nel campo dato un valore ed eliminarlo!
p NULL if (p != NULL) {
nodo* q=p;
while(q->next!=NULL){
if(q->next->dato==26){
node *r = q->next;
q->next = q->next->next;
delete r;
}
Nota: q=q->next;
Primo caso limite: Lista vuota!!! }
}
Si vuole cercare un nodo che contiene nel campo dato un valore ed eliminarlo!
p 26 2 16 13 NULL if (p != NULL) {
nodo* q=p;
q if (p->dato == 26) {
p = p->next; delete q;
}
p 26 2 16 13 NULL while(q->next!=NULL){
if(q->next->dato==26){
q node *r = q->next;
q->next = q->next->next;
p 2 16 13 NULL delete r;
q NULL }
q=q->next;
Nota: }
Secondo caso limite: primo nodo da levare!!!
}
Si vuole cercare un nodo che contiene nel campo dato un valore ed eliminarlo!
p 1 2 26 NULL if (p != NULL) {
nodo* q=p;
q if (p->dato == 26) {
p = p->next; delete q;
}
p 1 2 26 NULL while(q->next!=NULL){
if(q->next->dato==26){
q r node *r = q->next;
p 1 2 NULL q->next = q->next->next;
delete r;
q r NULL return;
}
q=q->next;
Nota: }
Terzo caso limite: ultimo nodo da levare!!! }
NULL
x 1 2 3 NULL 1 2 3 NULL
r NULL y t r y t NULL
NULL NULL
x 1 2 3 NULL 1 2 3
r y t
r y NULL
t NULL
12 99 37
struct node {
int n;
node * prev;
node * next;
};
12 99 37
12 99 37
12 99 37
12 99 37
Soluzione 1:
node * remove(node * t) {
t->next->prev = t->prev;
t->prev->next = t->next;
t->next = t->prev = NULL;
return t;
}
Soluzione 2:
void remove(node * t) {
t->next->prev = t->prev;
t->prev->next = t->next;
delete t;
}
12 37
12 99 37
x t
12 99 37
x t
12 99 37
x t