Liste 2 42) Definire un nuovo tipo di dati che rappresenta una lista di interi bidirezionale (ListaBidir). In questa lista ogni nodo dovra' avere un puntatore al nodo precedente (prev) e un puntatore al nodo successivo della lista (next), oltre al campo informativo (info, un intero). Naturalmente se il nodo precedente o il nodo successivo non esistesse, il corrispondente puntatore sarebbe NULL. Si noti che a differenza delle liste semplici, per manipolare una lista bidirezionale basta avere un puntatore a uno qualunque dei suoi nodi, non necessariamente alla testa. Scrivere una funzione StampaLista che, ricevuto un nodo qualsiasi di una ListaBidir, la stampi in questo modo: \\ <-> 1 <-> 2 <-> 3 <-> 4 <-> \\ 43) Scrivere una procedura insInListaBidir che ha come parametri una ListaBidir e un intero, e inserisce l'intero nella lista. Con quale modalita' deve essere passata la ListaBidir? 44) Definire una funzione creaListaBidir che chieda all'utente di fornire una sequenza di numeri interi terminati da un numero negativo e restituisca una ListaBidir che contenga i numeri inseriti. (Usare la funzione dell'esercizio precedente) 45) Scrivere una funzione lungListaBidir che abbia come parametro un puntatore a un nodo di una ListaBidir (non necessariamente il primo) e restituisca la lunghezza della lista. 46) Scrivere una procedura deallocaListaBidir che riceva come parametro l'indirizzo di un puntatore a un nodo di una ListaBidir (non necessariamente il primo) e deallochi tutta la lista. 47) Scrivere una funzione makeBidir che prende come parametro una ListaInt (lista semplice di interi) e ritorna una nuova ListaBidir contenente gli stessi elementi 48) Si consideri la dichiarazione del tipo ListInt (lista semplice di interi). Scrivere una funzione ricorsiva bigsRic che restituisce il numero di elementi della lista il cui valore sia strettamente maggiore della somma di tutti quelli che lo precedono. Esempi: – 1 -> // restituisce 1 – 0 -> // restituisce 0 – 1 -> 5 -> 3 -> 10 -> // restituisce 3 – 1 -> 2 -> 3 -> 4 -> // restituisce 2 49) Scrivere una procedura raddoppiaLista che dopo ogni elemento della ListaBidir data aggiunga un nuovo elemento con lo stesso campo info del precedente. Esempio: – // <-> 4 <-> 5 <-> 6 <-> 7 <-> // deve diventare – // <-> 4 <-> 4 <-> 5 <-> 5 <-> 6 <-> 6 <-> 7 <-> 7 <-> // 50) Scrivere una procedura ordinaIns che ordini (con l'algoritmo Insertion Sort) una ListaInt ricevuta ritornando il puntatore alla nuova testa della lista ordinata. Vedi: http://it.wikipedia.org/wiki/Insertion_sort 51) Scrivere una funzione che ricevuta una lista di interi e il puntatore ad una funzione booleana su interi, implementi la funzione filter ricorsivamente (senza modificare la lista originale) e ritorni il puntatore alla nuova lista risultato. Sugg: la logica della funzione filter e' spiegata negli appunti di programmazione funzionale Sugg 2: una funzione booleana ritorna interi che sono sempre 0 (falso) o 1 (vero). Sugg 3: un puntatore a una funzione e', in modo semplificato, il suo nome. Per esempio, la funzione int confronta(int a, int b); ha puntatore "confronta" (senza le ") e tipo int (*parametroFormale) (int, int) dove parametroFormale e' appunto il nome con cui quel puntatore a funzione puo' essere invocato dentro la vostra funzione (per richiamare ovviamente la funzione passata come parametro attuale).