Laboratorio di Linguaggi lezione IX: tipi ricorsivi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica Anno Accademico 2007/08
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i / U n i v e r s i t à d e l l I n s u b r i a Definizione tipi ricorsivi Definire tipi ricorsivi: typedef struct { char nome[20]; char cognome[20]; int peso; } Persona; Persona padre; Concettualmente sbagliato. Ricorsione infinita!
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i / U n i v e r s i t à d e l l I n s u b r i a Definizione tipi ricorsivi Definire tipi ricorsivi: typedef struct { char nome[20]; char cognome[20]; int peso; Persona* padre; } Persona; Concettualmente giusto. (l'ennesimo uso dei puntatori) Ma non compila perche' al momento della dichiarazione del campo padre il tipo Persona non esiste ancora.
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i / U n i v e r s i t à d e l l I n s u b r i a Definizione tipi ricorsivi Definire tipi ricorsivi: typedef struct P { char nome[20]; char cognome[20]; int peso; struct P *padre; } Persona; Persona a,b; a.padre = &b;
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i / U n i v e r s i t à d e l l I n s u b r i a Persona a,b; a.padre = &b; Definizione tipi ricorsivi Definire tipi ricorsivi: (modo alternativo) typedef struct Persona { char nome[20]; char cognome[20]; int peso; struct Persona *padre; }; struct Persona a,b; a.padre = &b;
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i / U n i v e r s i t à d e l l I n s u b r i a Liste Esempio: le liste typedef struct E { int data; struct E *next; } Elemento; typedef Elemento* pElemento; 1 5 / datanextdatanext
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i / U n i v e r s i t à d e l l I n s u b r i a Esempio: la lista di numeri ( 1, 5, 2 ) 5 2 / datanextdatanext 1 datanext start typedef struct E { int data; struct E *next; } Elemento; typedef Elemento* start;