Soluzioni esercizi lezione 12
Esercizi: ADT lista
1. Si assuma che una lista contenga i seguenti elementi:
< 10, 24, 3 | 20, 13, 5, 12 >
Si scrivano le istruzioni C++ che utilizzino l’ADT lista descritto nella lezione per cancellare
l’elemento con valore 5.
Soluzione
Sia L il nome della lista
L.next();
L.next();
elem = L.remove();
2. Si descriva la lista ottenuta dall’esecuzione delle seguenti operarazioni:
lista.append(10);
lista.append(20);
lista.insert(5);
lista.append(12);
lista.setStart();
lista.insert(24);
lista.next();
lista.insert(11);
Soluzione
| 24 11 5 10 20 12
Esercizio: lista basata su array e lista basata su puntatori
3. Si estendano le classi AList (lista basata su array) e Llist (lista basata su puntatori) aggiungendo
un nuovo metodo di nome reverse per invertire gli elementi presenti nella lista. Si valuti poi la
complessità dei due algoritmi realizzati nel caso medio.
template <class Elem>
void AList<Elem>::reverse() {
Elem temp;
for (int i=0; i<(listSize/2); i++){
temp = listArray[i];
listArray[i] = listArray[listSize-1];
listArray[listSize-1] = temp;
}
}
Quest’algoritmo di inversione della lista nel caso di implementazione basata su array è Θ(n) nel
caso medio (dove n è il numero di elementi della lista = listSize).
template <class Elem>
void LList<Elem>::reverse() {
if(head->next == NULL) return;
if (fence->next == NULL) fence = head;
else fence = fence->next;
link<Elem>* temp1 = head->next;
link<Elem>* temp2 = temp1->next;
while (temp2 != NULL) {
link<Elem>* temp3 = temp2->next;
temp2->next = temp1;
temp1 = temp2;
temp2 = temp3;
}
head->next = temp1;
}
Quest’algoritmo di inversione della lista nel caso di lista concatenata è Θ(n) nel caso medio.
Esercizio: confronto di prestazioni di spazio
4. Si determini il punto di pareggio per l’implementazione basata su array e l’implementazione
basata su lista concatenata nei casi in cui:
i. I dati di un elemento richiedano 8 byte, il puntatore occupi 4 byte, e la dimensione dell’array
sia 20
ii. I dati di un elemento richiedano 2 byte, il puntatore occupi 4 byte, e la dimensione dell’array
sia 30
iii. I dati di un elemento richiedano 32 byte, il puntatore occupi 4 byte, e la dimensione
dell’array sia 40
iv. I dati di un elemento richiedano 1 byte, il puntatore occupi 4 byte, e la dimensione dell’array
sia 30
Soluzione
i. E = 8, P = 4 e D = 20: il punto di pareggio è n = (20)(8)/(4 + 8) = 40/3 – lista concatenata è più
efficiente se vengono memorizzati 13 o meno elementi
ii. E = 2, P = 4 e D = 30: il punto di pareggio è n = (30)(2)/(2 + 4) = 10 – la lista concatenata è più
efficiente se vengono memorizzati meno di 10 elementi
iii. E = 32, P = 4 e D = 40: il punto di pareggio è n = (40)(32)/(32 + 4) = 35.5 – la lista concatenata è più
efficiente se vengono memorizzati 35 o meno elementi
iv. E = 1, P = 4 e D = 30: il punto di pareggio è n = (30)(1)/(1 + 4) = 6 – la lista concatenata è più
efficiente se vengono memorizzati meno di 6 elementi