Indice

Esercitazione 9

In alcuni degli esercizi che seguono (quando richiesto) si utilizzi la seguente definizione di tipo “lista di interi”:

typedef struct El {
int info;
struct El *next;
} ElementoListaInt;

typedef ElementoListaInt* ListaDiInteri;

Inoltre, dove c'è bisogno di allocazione dinamica della memoria, dovete assicurarvi di deallocare SEMPRE tutta la memoria allocata. Per verificarlo potete usare valgrind se correttamente installata sul vostro computer.

Questo strumento permette fra l'altro di capire se tutte le variabili sono inizializzate prima del loro uso, se accediamo a memoria gia' deallocata o mai allocata e situazioni similari.

Per fare questo procedere come segue:

bash$ gcc -Wall -pedantic -g -o prova main.c
bash$ valgrind ./prova

in questo modo, a schermo verranno riportare le infrazioni rilevate. Ad esempio,

invalid read

o

 
invalid write

sono accessi in lettura o scrittura a memoria non allocata o gia' deallocata. valgrind contiene moltissime opzioni, invitiamo gli studenti interessati ad esplorarle partendo dal sito

http://valgrind.org/

Ricordate infine che dovete includere la libreria stdlib.h per la gestione della memoria dinamica.

Esercizio 1

Definire un nuovo tipo di dato capace di rappresentare una data. Scrivere poi delle opportune funzioni/procedure che:

Esercizio 2

Scrivere un programma che crei dinamicamente una lista di 3 interi e li inizializzi con valori chiesti all'utente e stampi la lista a video in questo modo:

1 -> 9 -> 3 //

Il programma deve deallocare correttamente la lista prima di uscire, verificare con valgrind che questo sia avvenuto (se correttamente installato sul vostro pc).

Esercizio 3

Scrivere una procedura iterativa che stampi una lista (di lunghezza qualsiasi) a video in questo modo:

1 -> 9 -> 3 //

Utilizzare la procedura nel main precedente per verificarne la correttezza.

Esercizio 4

Scrivere un programma che chieda all'utente un numero N e crei una lista con N elementi, inizializzata con i primi N naturali.

Il programma deve deallocare correttamente la lista prima di uscire,verificare con valgrind che questo sia avvenuto (se correttamente installato sul vostro pc).

Esercizio 5

Scrivere una *funzione* che calcoli la lunghezza di una lista percorrendo la lista dall'inizio alla fine.

Testare questa funzione utilizzando un'opportuno main.

Ricordarsi di deallocare la lista prima di uscire dal main.

Esercizio 6

Scrivere una procedura *ricorsiva* che stampi una lista (di lunghezza qualsiasi) a video in questo modo:

1 -> 9 -> 3 //

Esercizio 7

Scrivere una *procedura* iterativa che dato un n intero, crei una lista di n elementi inizializzati con variabili random.

Scrivere un main per testarla.

Esercizio 8

Scrivere una *funzione* che dato un n intero, crei una lista di n elementi inizializzati con variabili random.

Scrivere un main per testarla.

Esercizio 9

Scrivere una *funzione* *ricorsiva* che calcoli la lunghezza di una lista.

Scrivere un main per testarla.

Esercizio 10

Scrivere una *funzione* *iterativa* che controlli che la lista contenga solo interi positivi.

Scrivere un main per testarla.

Esercizio 11

Scrivere una *funzione* *ricorsiva* che controlli che la lista contenga solo interi positivi.

Scrivere un main per testarla.