Strutture dati dinamiche in C (II)

Documenti analoghi
Rappresentazione di liste mediante puntatori in linguaggio C

Strutture Dinamiche. Fondamenti di Informatica

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

Per semplicità eliminiamo le ripetizioni nell'albero.

Esercitazione 6. Alberi binari di ricerca

Struttura dati astratta Coda

Implementazione di Liste puntate

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

Alberi binari e alberi binari di ricerca

Appello di Informatica B

Alberi binari. Esercizi su alberi binari

Strutture dati dinamiche

La struttura dati ad albero binario

Esercizio 1 Liste: calcolo perimetro di un poligono

Compito di Fondamenti di Informatica

I file Laboratorio di Linguaggi di Programmazione a.a. 2001/2002

I puntatori e l allocazione dinamica di memoria

Il tipo di dato astratto Pila

I tipi di dato astratti

Lezione 9: Strutture e allocazione dinamica della memoria

21 - Alberi e Ricorsione

2. Spiegare brevemente qual è la funzione del compilatore e la sua importanza per il programmatore.

Laboratorio di Algoritmi e Strutture Dati

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

Esercizio 1: Puntatori impiegati che sono manager

Linguaggio C: puntatori

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

Heap e code di priorità

Introduzione alla programmazione ricorsiva

CREARE UNA LIBRERIA IN C

lezione 9 min-heap binario Heap e Alberi posizionali generali

Definizione Allocazione e deallocazione di variabili Allocazione e deallocazione di vettori

Creare una funzione float square(float x). La funzione deve restituire il quadrato del parametro x.

Una funzione è detta ricorsiva se chiama, direttamente o indirettamente, se stessa. In C tutte le funzioni possono essere usate ricorsivamente.

(1) - - (4) R4 = R7 * R7 (4) (2) (3) 5 - (4) rinviata perché in WAW con (3) 6 (3) e (4) ritirabili ma attendono il completamento di (2) (2) (3) (4)

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C

Esempio di Prova Scritta

Unità Didattica 5 Linguaggio C. Stringhe. Accesso a file ASCII. Strutture.

Contenitori: Pile e Code

Gestione di files Motivazioni

Indirizzo di una funzione. Puntatori a funzioni. Definizione di variabili. Definizione di variabili

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C

Esercizio: gestione di un conto corrente

dall argomento argomento della malloc()

Esercitazione 6. Array

La sintassi del C APPENDICE H

Scrittura formattata - printf

PROGRAMMAZIONE AVANZATA JAVA E C. Massimiliano Redolfi. Lezione 7: Code, Stack, Liste PAJC. Ricerca. prof. Massimiliano Redolfi PAJC

Tipi di Dato Ricorsivi

Grafi: visita generica

Linguaggi di programmazione + laboratorio a.a. 2012/2013

Politecnico di Milano - Facoltà di Ingegneria INFORMATICA A - Corso per allievi GESTIONALI - Prof. C. SILVANO A. A. 2001/ febbraio A

Laboratorio di Algoritmi e Strutture Dati

LISTE, INSIEMI, ALBERI E RICORSIONE

Corso di Fondamenti di Informatica (M-Z)

Le Funzioni e la Ricorsione

Alberi binari di ricerca

Introduzione alla programmazione in C

PROGRAMMI LINGUAGGIO C

Consideriamo un vettore allocato dinamicamente

Verifica che una grammatica sia Context Free nel GrammaReader

Le Liste. Elisa Marengo. Università degli Studi di Torino Dipartimento di Informatica. Elisa Marengo (UNITO) Le Liste 1 / 31

Sommario PREFAZIONE...XI CAPITOLO 1: INTRODUZIONE AI COMPUTER, A INTERNET E AL WEB... 1 CAPITOLO 2: INTRODUZIONE ALLA PROGRAMMAZIONE IN C...

Appunti tratti dal videocorso on-line di Algoritmi e Programmazione Avanzata By ALeXio

RICORSIVITA. Vediamo come si programma la soluzione ricorsiva al problema precedente: Poniamo S 1 =1 S 2 =1+2 S 3 =1+2+3

Il linguaggio C. Notate che...

I B+ Alberi. Sommario

La gestione della memoria

Alberi Binari di Ricerca

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

Introduzione al Linguaggio C ed all IDE DEV-C++

Le operazioni di allocazione e deallocazione sono a carico del sistema.

Compitino di Laboratorio di Informatica CdL in Matematica 13/11/2007 Teoria Compito A

Esercitazione 5. Procedure e Funzioni Il comando condizionale: switch

Laboratorio di Algoritmi e Strutture Dati

Problem solving avanzato

Stringhe e allocazione dinamica della memoria

Corso di Informatica 1 Esercitazione n. 4

Transcript:

Strutture dati dinamiche in C (II) Laboratorio di Linguaggi di Programmazione a.a. 2001/2002 dott.ssa Francesca A. Lisi lisi@di.uniba.it

Sommario Le liste concatenate (ancora ma in modo più formale) L acquisizione di grammatiche (ancora... ma con ulteriori suggerimenti) Introduzione agli alberi binari Riferimenti cap. 12 di Deitel & Deitel par. 6.5 di Kernighan & Ritchie cap.1 di Semeraro

Dichiarazione di un tipo lista typedef... TipoElemLista; struct StructLista { TipoElemLista info; /* elemento della lista */ struct StructLista *next; /* puntatore all'elemento successivo */ }; typedef struct StructLista TipoNodoLista; typedef TipoNodoLista *TipoLista;

Inizializzazione di una lista void InitLista(TipoLista *l) /* Inizializza l alla lista vuota. */ { *l = NULL; } bool TestListaVuota(TipoLista l) /* Restituisce TRUE se l e` la lista vuota, FALSE altrimenti. */ { } return (l == NULL);

Inserimento elementi in testa ad una lista void InserisciTestaLista (TipoLista *l, TipoElemLista elem) { TipoLista paux; } paux = malloc(sizeof(tiponodolista)); paux->info = elem; paux->next = *l; *l = paux;

Inserimento elementi in coda ad una lista void InserisciCodaLista (TipoLista *l, TipoElemLista elem) /* Versione iterativa. */ { TipoLista ultimo; /* puntatore usato per la scansione */ TipoLista paux; /* creazione del nuovo nodo */ paux = malloc(sizeof(tiponodolista)); paux->info = elem; paux->next = NULL;

Inserimento elementi in coda ad una lista (II) /* scansione della lista */ if (*l == NULL) *l = paux; else { ultimo = *l; while (ultimo->next!= NULL) ultimo = ultimo->next; /* concatenazione del nuovo nodo */ ultimo->next = paux; } } /* InserisciCodaLista */

Esercizi Scrivere una funzione C che restituisca l elemento in testa ad una lista Scrivere una funzione C che restituisca l elemento in coda ad una lista Scrivere una funzione C che risolva il problema dell inserimento di un elemento in coda ad una lista in maniera ricorsiva Scrivere una funzione C che faccia la copia di una lista in ingresso Scrivere una funzione C che stampi una lista di interi

Esempio con una lista di caratteri /* programma char-list.c */ #include <stdio.h> #include <stdlib.h> #define TRUE 1 #define FALSE 0 typedef int bool; typedef char TipoElemLista; #include "tipolis.c" #include "liste.c"

Esempio con una lista di caratteri (II) int main(void) { TipoLista l; } l = malloc(sizeof(tiponodolista)); l->info = 'B'; l->next = NULL; /* l punta alla lista ('B') */ InserisciTestaLista(&l, 'A'); /* l punta alla lista('a','b') */ InserisciCodaLista(&l, 'C'); /* l punta alla lista('a','b','c') */ return 0;

Acquisizione di grammatiche: un esempio illustrativo Cfr. grammatica a pag. 5 del libro Appunti di Teoria dei Linguaggi Formali - G. Semeraro 1) <frase_nominale> ::= <parte_nominale><parte_verbale><parte_nominale> 2) <parte_nominale> ::= <articolo><nome> 3) <nome> ::= car man dog 4) <articolo> ::= the a 5) <articolo> ::= hits eats

Acquisizione di grammatiche: un esempio illustrativo (II) gramm[0] sx <frase_nominale>\ 0 dx <parte_nominale>\ 0 <parte_verbale>\ 0 <parte_nominale>\ 0 gramm[1] sx dx <parte_nominale>\ 0 <articolo>\ 0 <nome>\ 0 gramm[2] gramm[3] gramm[4] gramm[5] sx <nome>\ 0 dx car\ 0 sx <nome>\ 0 dx man\ 0 sx <nome>\ 0 dx dog\ 0 sx <articolo>\ 0 dx the\ 0 gramm[6]... sx dx.... <articolo>\ 0 a\ 0

Alberi binari Ogni elemento può puntare ad almeno due elementi della struttura In un albero binario, ogni nodo contiene due puntatori Nessuno, uno, od entrambi dei quali possono essere NULL Se un nodo a punta ad un nodo b, a sidice nodo padre e b si dice nodo figlio Il nodo radice è un nodo senza padre Un nodo senza figli si dice nodo foglia B A D C

struct el_alb_bin { /* dati */ struct el_alb_bin *figlio_sx; struct el_alb_bin *figlio_dx; } *alb_bin = null; Alberi binari (II) /* creazione ed inizializzazione di new_el */ struct el_alb_bin *new_el = (struct el_alb_bin *)malloc(sizeof(struct el_alb_bin)); (*new_el).figlio_sx = (*new_el).figlio_dx = null; alb_bin = new_el;