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