Programmazione I - Laboratorio

Documenti analoghi
Programmazione I - Laboratorio

Programmazione I - Laboratorio

Laboratorio di Programmazione

Esercitazione 11. Liste semplici

Strutture Dinamiche. Fondamenti di Informatica

Strutture dati dinamiche in C (II)

Prof. E. Occhiuto INFORMATICA 242AA a.a. 2010/11 pag. 1

La programmazione nel linguaggio C

Inserimento in una lista ordinata

Il linguaggio C Strutture

Programmazione I - Laboratorio

Inserimento di un elemento in coda. quale va collegato quello nuovo. ultimo. *lista 8 3. aux. ultimo. *lista 8 3. aux

4 Le liste collegate 4.0. Le liste collegate. 4 Le liste collegate Rappresentazione di liste 4.1 Rappresentazione di liste

(*lista == NULL (*lista)->info >= elem) accede al campo next di *lista solo se *lista non e' NULL. */ #include <stdio.h> #include <stdlib.

Il linguaggio C. Puntatori e dintorni

Fondamenti di Informatica II

dott. Sabrina Senatore

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

Programmazione I - Laboratorio

Fondamenti di Informatica T-1, 2010/2011 Modulo 2. Prova d Esame 5A di Mercoledì 13 Luglio 2011 tempo a disposizione 2h

ADT LISTA: altre operazioni non primitive ADT LISTA COSTRUZIONE ADT LISTA COSTRUZIONE ADT LISTA (2)

a.a Codice corso: 21012, La definizione del tipo di dato astratto lista è intrinsecamente ricorsiva, infatti una lista può essere:

Introduzione al C. Unità Gestione Dinamica della Memoria

FUNZIONI che operano su LISTE

Esercitazione 12. Esercizi di Ricapitolazione

Esercizio 1: funzione con valore di ritorno di tipo puntatore

Allocazione dinamica della memoria

5. Quinta esercitazione autoguidata: liste semplici

PILE E CODE. Pile (stack):

Consideriamo un vettore allocato dinamicamente

Hash Table. Hash Table

Esercitazione 7. Tutor: Ing. Diego Rughetti. Anno Accademico 2007/2008

Laboratorio di Informatica

I puntatori e l allocazione dinamica di memoria

Laboratorio di Programmazione: Linguaggio C Lezione 21 del 19 maggio 2014

Fondamenti di Informatica T-1, 2015/2016 Modulo 2. Prova d Esame 3A di Venerdì 12 Febbraio 2016 tempo a disposizione 2h

L'Allocazione Dinamica della Memoria nel linguaggio C

Esercizi Strutture dati di tipo astratto

Gestione dinamica della memoria

giapresente( ) leggi( ) char * strstr(char * cs, char * ct) NULL

C: panoramica. Violetta Lonati

La struttura dati CODA

Implementazione di Liste puntate

Informatica 1. Prova di recupero 21 Settembre 2001

Strutture dati. Le liste

Linguaggio C. Esercizio 1

Fondamenti di Informatica T-1, 2014/2015 Modulo 2. Prova d Esame 2A di Martedì 29 Gennaio 2015 tempo a disposizione 2h

ELEMENTI DI INFORMATICA LB ESERCITAZIONE (del 09/03/2007) Files, Strutture e Liste

ESERCIZIO 1. AZ111 milano 12:34 23 AZ222 buenos-aires 12: BA333 toronto 4:15 20 KM444 madrid 10:12 100

Rappresentazione di liste mediante puntatori in linguaggio C

Esercizio 1: Puntatori impiegati che sono manager

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

! Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente

fondamenti di informatica 2 programmazione in C++ Riccardo Galletti - tratto da

Liste Doppiamente Collegate

Strutture Dati Dinamiche

Linguaggio C - Strutture

Il linguaggio C. Puntatori e dintorni

Fondamenti di Informatica T-1, 2015/2016 Modulo 2. Prova d Esame 5A di Giovedì 7 Luglio 2016 tempo a disposizione 2h

Implementazione dell albero binario in linguaggio C++

Lezione 8 Struct e qsort

Laboratorio di Algoritmi e Strutture Dati

Alberi binari e alberi binari di ricerca

Esercizi di programmazione in linguaggio C English Dictionary

Fondamenti di Informatica T-1, 2017/2018 Modulo 2. Prova d Esame 1A di Giovedì 11 Gennaio 2018 tempo a disposizione 2h

Programmazione (imperativa)

Fondamenti di Informatica e Laboratorio T-AB T-15 Strutture dati

Variabili dinamiche. Obiettivi: Presentare le variabili dinamiche, allocate e deallocate nell area HEAP, e le funzioni malloc e free

Liste a puntatori: un esercizio passo passo

Definizione Allocazione e deallocazione di variabili Allocazione e deallocazione di vettori

LABORATORIO DI PROGRAMMAZIONE 2 Corso di laurea in matematica. Algoritmi ricorsivi

Puntatori. Un puntatore contiene un numero che indica la locazione di memoria dove è presente la variabile puntata

Algoritmi di ordinamento: Array e ricorsione

Esercizi. La funzione swapint() primo tentativo

Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

PROVA SCRITTA 23 MARZO 2010

Struct, enum, Puntatori e Array dinamici

Fondamenti di informatica, Sez. Ing. Informatica, Ing. Gestionale, Ing. Ambientale II prova in itinere, 29 Gennaio 2009

Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.

ARRAY E STRINGHE. ESERCIZIO 2 Scrivere un programma che calcola il numero di doppie e di dittonghi (2 vocali vicine) presenti in una stringa.

PUNTATORI A STRUTTURE

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Fondamenti di Informatica T-1, 2017/2018 Modulo 2. Prova d Esame 2A di Giovedì 25 Gennaio 2018 tempo a disposizione 2h

Esercizio 1 Liste: calcolo perimetro di un poligono

Programmazione. Laboratorio. Roberto Cordone DI - Università degli Studi di Milano

Informatica 1. Corso di Laurea Triennale in Matematica. Gianluca Rossi

Informatica 1. Corso di Laurea Triennale in Matematica. Gianluca Rossi

Fondamenti di Informatica T-1, 2014/2015 Modulo 2. Prova d Esame 1A di Martedì 13 Gennaio 2015 tempo a disposizione 2h

La gestione della memoria

Corso di Informatica 1 (IN1) Tutorato n. 11

Rappresentazione collegata mediante puntatori di una lista

Fondamenti di Programmazione

Linked Lists. Liste linkate (1) liste linkate ( stack, queues ), trees. Liste linkate come strutture

La gestione della memoria dinamica Heap

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

Una breve introduzione all implementazione in C di algoritmi su grafo

Fondamenti di Informatica AA 2016/2017

Fondamenti di Informatica T-1, 2011/2012 Modulo 2. Prova d Esame 2A di Giovedì 12 Gennaio 2012 tempo a disposizione 2h

Transcript:

Programmazione I - Laboratorio Esercitazione 6 - Liste Gianluca Mezzetti 1 Paolo Milazzo 2 1. Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ mezzetti mezzetti di.unipi.it 2. Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it Corso di Laurea in Informatica A.A. 2012/2013 G. Mezzetti & P. Milazzo (Univ. di Pisa) Esercitazione 6 A.A. 2012/2013 1 / 23

Liste Usare la seguente definizione negli esercizi seguenti: struct el int info ; struct el * next ; typedef struct el ElementoDiLista ; typedef ElementoDiLista * ListaDiElementi ; G. Mezzetti & P. Milazzo (Univ. di Pisa) Esercitazione 6 A.A. 2012/2013 2 / 23

Esercizio 1 Scrivere una funzione stampalista che ricevuta una ListaDiElementi, la stampi a video in questo modo: 1 -> 2 -> 3 -> 4 -> // G. Mezzetti & P. Milazzo (Univ. di Pisa) Esercitazione 6 A.A. 2012/2013 3 / 23

Esercizio 1 - esercizio1.c /* esercizio1.c */ # include <stdio.h> # include < stdlib.h> # include " definizione_lista. h" # include " esercizio1. h" void stampalista ( ListaDiElementi l) if (l== NULL ) printf (" //\ n"); else printf ("%d -> ",l-> info ); stampalista (l- > next ); G. Mezzetti & P. Milazzo (Univ. di Pisa) Esercitazione 6 A.A. 2012/2013 4 / 23

Esercizio 2 Definire una funzione (fornirne due versioni, una iterativa e una ricorsiva) lunghezzalista che data una ListaDiElementi, restituisca la sua lunghezza G. Mezzetti & P. Milazzo (Univ. di Pisa) Esercitazione 6 A.A. 2012/2013 5 / 23

Esercizio 2 - esercizio2.c /* esercizio2.c */ # include < stdlib.h> # include " definizione_lista. h" # include " esercizio2. h" int lunghezzalista_iterativa ( ListaDiElementi l) int len =0; while (l!= NULL ) l=l-> next ; len ++; return len ; int lunghezzalista_ricorsiva ( ListaDiElementi l) if ( l== NULL ) return 0; else return lunghezzalista_ricorsiva (l- > next )+1; G. Mezzetti & P. Milazzo (Univ. di Pisa) Esercitazione 6 A.A. 2012/2013 6 / 23

Esercizio 3 Definire una funzione deallocalista che riceve una ListaDiElementi e ne dealloca tutti gli elementi. G. Mezzetti & P. Milazzo (Univ. di Pisa) Esercitazione 6 A.A. 2012/2013 7 / 23

Esercizio 3 - esercizio3.c /* esercizio3.c */ # include < stdlib.h> # include " definizione_lista. h" # include " esercizio3. h" void deallocalista ( ListaDiElementi l) if (l!= NULL ) deallocalista (l- > next ); free (l); G. Mezzetti & P. Milazzo (Univ. di Pisa) Esercitazione 6 A.A. 2012/2013 8 / 23

Esercizio 4 Definire una funzione (fornirne due versioni, una iterativa e una ricorsiva) primopari che data una ListaDiElementi, restituisca il puntatore al primo elemento pari nella lista (restituisce NULL se la lista e vuota o non contiene elementi pari) G. Mezzetti & P. Milazzo (Univ. di Pisa) Esercitazione 6 A.A. 2012/2013 9 / 23

Esercizio 4 - esercizio4.c /* esercizio4.c */ # include < stdlib.h> # include " definizione_lista. h" # include " esercizio4. h" ListaDiElementi primopari_iterativo ( ListaDiElementi l) while ((l!= NULL )&&(l-> info %2!=0)) /* notare ordine condizioni in and * l=l-> next ; return l; ListaDiElementi primopari_ricorsivo ( ListaDiElementi l) if ((l== NULL ) (l-> info %2==0)) return l; else primopari_ricorsivo (l- > next ); G. Mezzetti & P. Milazzo (Univ. di Pisa) Esercitazione 6 A.A. 2012/2013 10 / 23

Esercizio 5 Definire una funzione (fornirne due versioni, una iterativa e una ricorsiva) minimopari che data una ListaDiInteri, restituisca il puntatore al minimo elemento pari nella lista (restituisce NULL se la lista e vuota o non contiene elementi pari) G. Mezzetti & P. Milazzo (Univ. di Pisa) Esercitazione 6 A.A. 2012/2013 11 / 23

Esercizio 5 - esercizio5.c /* esercizio5.c */ # include < stdlib.h> # include " definizione_lista. h" # include " esercizio5. h" ListaDiElementi minimopari_iterativo ( ListaDiElementi l) ListaDiElementi min = NULL ; while (l!= NULL ) /* come primopari ( esercizio4 ) */ while (( l!= NULL )&&( l- > info %2!=0)) /* notare ordine condizioni in an l=l-> next ; if ( min == NULL ) min =l; else if ((l!= NULL )&&(l->info <min -> info )) min =l; if (l!= NULL ) l=l-> next ; return min ; ListaDiElementi minimopari_ricorsivo ( ListaDiElementi l) if (l== NULL ) return NULL ; /* un solo elemento pari */ else if ((l-> next == NULL )&&(l-> info %2==0)) return l; /* un solo elemento dispari */ else if (l- > next == NULL ) return NULL ; else G. Mezzetti ListaDiElementi & P. Milazzo (Univ. di Pisa) rest = minimopari_ricorsivo Esercitazione 6 (l- > next A.A. ); 2012/2013 12 / 23

Esercizio 6 Definire una procedura (sia iterativa che ricorsiva) elimina che ricevuta una ListaDiElementi e un intero X, elimini (senza deallocare) i primi X elementi e ritorni il puntatore alla testa della lista modificata G. Mezzetti & P. Milazzo (Univ. di Pisa) Esercitazione 6 A.A. 2012/2013 13 / 23

Esercizio 6 - esercizio6.c /* esercizio6.c */ # include < stdlib.h> # include " definizione_lista. h" # include " esercizio6. h" ListaDiElementi elimina_iterativo ( ListaDiElementi l, int X) while ((l!= NULL )&&(X >0)) l=l-> next ; X - -; return l; ListaDiElementi elimina_ricorsivo ( ListaDiElementi l, int X) if (l== NULL X ==0) return l; else return elimina_ricorsivo (l- >next,x -1); G. Mezzetti & P. Milazzo (Univ. di Pisa) Esercitazione 6 A.A. 2012/2013 14 / 23

Esercizio 7 Definire una funzione ordinalista che modifica una ListaDiElementi data ordinandola in modo crescente. La funzione non deve usare allocazione dinamica della memoria (malloc e free), ne modificare il campo info degli elementi. La funzione restituisce il puntatore al primo elemento ottenuto dopo l ordinamento G. Mezzetti & P. Milazzo (Univ. di Pisa) Esercitazione 6 A.A. 2012/2013 15 / 23

Esercizio 7 - esercizio7.c I /* esercizio7.c */ # include < stdlib.h> # include " definizione_lista. h" # include " esercizio7. h" ListaDiElementi ordinalista ( ListaDiElementi l) ListaDiElementi l1,tmp, prec_tmp ; if ((l== NULL ) (l-> next == NULL )) return l; else l1 = ordinalista (l- > next ); /* l1 e di sicuro non vuota */ tmp = l1; prec_tmp = l; /* ATTENZIONE : l ordine delle condizioni in && e importante! */ while (( tmp!= NULL )&&( tmp ->info <l-> info )) prec_tmp = tmp ; tmp =tmp -> next ; /* devo piazzare il primo elemento di l dentro a l1 */ if ( tmp == NULL ) /* inserimento in coda */ l-> next = NULL ; prec_tmp -> next =l; G. Mezzetti & P. Milazzo (Univ. di Pisa) Esercitazione 6 A.A. 2012/2013 16 / 23

Esercizio 7 - esercizio7.c II return l1; else if ( tmp == l1) /* inserimento in testa */ l-> next =l1; return l; else /* inserimento in mezzo */ l-> next = tmp ; prec_tmp - > next = l; return l1; G. Mezzetti & P. Milazzo (Univ. di Pisa) Esercitazione 6 A.A. 2012/2013 17 / 23

Esercizio 8 Definire una funzione merge che date due ListaDiElementi ordinate, restituisca una nuova ListaDiElementi ordinata contenente tutti gli elementi delle due liste. Le liste originali devono restare immutate G. Mezzetti & P. Milazzo (Univ. di Pisa) Esercitazione 6 A.A. 2012/2013 18 / 23

Esercizio 8 - esercizio8.c I /* esercizio8.c */ # include < stdlib.h> # include " definizione_lista. h" # include " esercizio8. h" ListaDiElementi merge ( ListaDiElementi l1, ListaDiElementi l2) ListaDiElementi risultato = NULL ; ListaDiElementi new = NULL ; int primavolta = 1; /* scorre le due liste simultaneamente */ while (( l1!= NULL )&&( l2!= NULL )) if ( primavolta ) new = ( ListaDiElementi ) malloc ( sizeof ( ElementoDiLista )); risultato = new ; primavolta =0; else new -> next = ( ListaDiElementi ) malloc ( sizeof ( ElementoDiLista )); new =new -> next ; if (l1 ->info <l2 -> info ) new -> info =l1 -> info ; l1=l1 -> next ; else G. Mezzetti & P. Milazzo (Univ. di Pisa) Esercitazione 6 A.A. 2012/2013 19 / 23

Esercizio 8 - esercizio8.c II new -> info =l2 -> info ; l2=l2 -> next ; /* uno ( e solo uno ) dei seguenti due cicli viene eseguito */ while (l1!= NULL ) new -> next = ( ListaDiElementi ) malloc ( sizeof ( ElementoDiLista )); new =new -> next ; new -> info = l1 -> info ; l1 = l1 -> next ; while (l2!= NULL ) new -> next = ( ListaDiElementi ) malloc ( sizeof ( ElementoDiLista )); new =new -> next ; new -> info = l2 -> info ; l2 = l2 -> next ; /* mette NULL in fondo alla lista */ if ( new!= NULL ) new -> next = NULL ; return risultato ; G. Mezzetti & P. Milazzo (Univ. di Pisa) Esercitazione 6 A.A. 2012/2013 20 / 23

Il main di questa esercitazione - main.c I L insieme degli esercizi di questa esercitazione e il main seguente sono un esempio di programmazione modulare a cui si può applicare la compilazione separata dei moduli /* programma che esegue tutti gli esercizi sulle liste di questa lezion */ # include <stdio.h> # include < stdlib.h> # include <time.h> # include " definizione_lista. h" # include " esercizio1. h" # include " esercizio2. h" # include " esercizio3. h" # include " esercizio4. h" # include " esercizio5. h" # include " esercizio6. h" # include " esercizio7. h" # include " esercizio8. h" ListaDiElementi generalista (); int main () G. Mezzetti & P. Milazzo (Univ. di Pisa) Esercitazione 6 A.A. 2012/2013 21 / 23

Il main di questa esercitazione - main.c II ListaDiElementi l1,l2, lord1, lord2, ltmp ; srand ( time (0)); l1 = generalista (10); l2 = generalista (14); printf (" Esercizio 1:\ n"); printf (" Lista l1\n"); stampalista ( l1 ); printf (" Lista l2\n"); stampalista ( l2 ); printf ("\n"); printf (" Esercizio 2:\ n"); printf (" Lunghezze l1: % d\ n", lunghezzalista_iterativa ( l1 )); printf (" Lunghezze l2: % d\ n", lunghezzalista_ricorsiva ( l2 )); printf ("\n"); printf (" Esercizio 3:\ n"); ltmp = generalista (3); deallocalista ( ltmp ); printf (" Niente da visualizzare per questo esercizio \ n"); printf ("\n"); G. Mezzetti & P. Milazzo (Univ. di Pisa) Esercitazione 6 A.A. 2012/2013 22 / 23

Il main di questa esercitazione - main.c III printf (" Esercizio 4:\ n"); printf (" Primo pari l1: %d\n",primopari_iterativo (l1)-> info ); printf (" Primo pari l2: %d\n",primopari_ricorsivo (l2)-> info ); printf ("\n"); printf (" Esercizio 5:\ n"); printf (" Minimo pari l1: %d\n",minimopari_iterativo (l1)-> info ); printf (" Minimo pari l2: %d\n",minimopari_ricorsivo (l2)-> info ); printf ("\n"); printf (" Esercizio 6:\ n"); printf (" Elimina i primi 3 da l1\ n"); ltmp = elimina_iterativo ( l1,3); stampalista ( ltmp ); printf (" Elimina i primi 3 da l2\ n"); ltmp = elimina_ricorsivo ( l2,3); stampalista ( ltmp ); printf ("\n"); printf (" Esercizio 7:\ n"); printf (" Ordina l1\n"); lord1 = ordinalista (l1 ); stampalista ( lord1 ); printf (" Ordina l2\n"); G. Mezzetti & P. Milazzo (Univ. di Pisa) Esercitazione 6 A.A. 2012/2013 23 / 23

Il main di questa esercitazione - main.c IV lord2 = ordinalista (l2 ); stampalista ( lord2 ); printf ("\n"); printf (" Esercizio 8:\ n"); printf (" Fusione di l1 e l2\ n"); ltmp = merge ( lord1, lord2 ); stampalista ( ltmp ); printf ("\n"); return 0; ListaDiElementi generalista ( int numelem ) if ( numelem ==0) return NULL ; else ListaDiElementi new = ( ListaDiElementi ) malloc ( sizeof ( ElementoDiLi new -> info = rand ()%100; new -> next = generalista ( numelem -1); return new ; G. Mezzetti & P. Milazzo (Univ. di Pisa) Esercitazione 6 A.A. 2012/2013 24 / 23