Laboratorio di Algoritmi e Strutture Dati



Похожие документы
Laboratorio di Algoritmi e Strutture Dati

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

La struttura dati ad albero binario

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

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

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

Laboratorio di Algoritmi e Strutture Dati

Implementazione di Liste puntate

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

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Compito di Fondamenti di Informatica

I puntatori e l allocazione dinamica di memoria

Tipi di Dato Ricorsivi

Esercizio: gestione di un conto corrente

(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)

Appello di Informatica B

Il tipo di dato astratto Pila

Laboratorio di programmazione

Gestione dinamica di una pila

costruttori e distruttori

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

Algoritmi e Strutture Dati

LISTE, INSIEMI, ALBERI E RICORSIONE

Utilizzo e scrittura di classi

Lezione 9: Strutture e allocazione dinamica della memoria

Gestione dei File in C

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Fondamenti di Informatica T. Linguaggio C: i puntatori

Le funzioni in C. I programmi C sono costituiti da definizioni di variabili e funzioni.

Algoritmi di Ricerca. Esempi di programmi Java

Sottoprogrammi: astrazione procedurale

Funzioni in C. Violetta Lonati

Sistemi Operativi (M. Cesati)

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

PROGRAMMI LINGUAGGIO C

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

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

dall argomento argomento della malloc()

Liste a puntatori: un esercizio passo passo

Concetti chiave. Struct. Variabili strutturate: il tipo struct Elementi di una struttura typedef e struct Array di strutture

Fondamenti di Informatica T-1, 2009/2010 Modulo 2 Prova d Esame 5 di Giovedì 15 Luglio 2010 tempo a disposizione 2h30'

Esercitazione 10. Strutture ed Enumerazioni. Allocazione dinamica di memoria

Laboratorio di Algoritmi e Strutture Dati

Record in C: il costruttore struct.

Esercizio 1. Esercizio 1

Calcolare il massimo di una lista

Corso di Informatica Medica Esercitazione 1I ! Alessandro A. Nacci - alessandronacci.com

RICERCA DI UN ELEMENTO

I file di dati. Unità didattica D1 1

Allocazione dinamica della memoria - riepilogo

INFORMATICA 1 L. Mezzalira

OTTAVA ESPERIENZA DI LABORATORIO. L elaborazione dei files in C

Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main

Inizializzazione, Assegnamento e Distruzione di Classi

Quotazione compareto( ) Quotazione piurecente( ) Quotazione Quotazione Quotazione non trovato count( )

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Algoritmi su array / 2

Sistemi Operativi. Interfaccia del File System FILE SYSTEM : INTERFACCIA. Concetto di File. Metodi di Accesso. Struttura delle Directory

Oggetti Lezione 3. aspetti generali e definizione di classi I

AXO. Operativo. Architetture dei Calcolatori e Sistema. programmazione di sistema

Dipartimento di Elettronica, Informazione e Bioingegneria Politecnico di Milano

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica

Informatica 3. LEZIONE 7: Fondamenti di programmazione orientata agli oggetti (1)

Corso di Fondamenti di Informatica Algoritmi su array / 2

Corso di Informatica 1 (IN1) Tutorato n. 11

void funzioneprova() { int x=2; cout<<"dentro la funzione x="<<x<<endl; }

Alberi binari di ricerca

Esercitazione 11. Liste semplici

1: /* Nome del programma: gestione_articoli_01.cpp 2: Realizzato da: Gaetano Della Cerra 3: Data: 06/02/ III Informatica Serale I.T.I.S.

Problem solving avanzato

Introduzione alla programmazione in C

Esame di Informatica Generale 9 CFU 21 Giugno 2011 Professori: Carulli, Fiorino, Mazzei

2. I THREAD. 2.1 Introduzione

Introduzione al linguaggio C Gli array

obiettivi di questa seconda metà del corso fare un passo avanti rispetto a :... meccanismi di composizione dei dati

Dynamic Linking. Introduzione Creazione di una libreria dinamica Uso di una libreria dinamica

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2011

Fondamenti di Informatica T-1, 2010/2011 Modulo 2. Prova d Esame 4A di Martedì 21 Giugno 2011 tempo a disposizione 2h

Capitolo Silberschatz

Транскрипт:

Laboratorio di Algoritmi e Strutture Dati Aniello Murano http://people.na.infn.it people.na.infn.it/~murano/ 1 Operazioni su Liste Doppie e Circolari 2 1

Indice Liste puntate semplici: Gli elementi sono logicamente organizzati in modo sequenziale e si possono scorrere in un unico verso. La lista ha un primo elemento chiamato testa e un ultimo elemento chiamato coda Testa coda Liste doppiamente puntate: Sono simili alle liste puntate semplici, ma permettono di scorrere gli elementi in entrambi i versi Liste puntate semplici circolari: Sono liste puntate semplici senza testa ne coda. Liste doppiamente puntate circolari: Liste doppiamente puntate senza testa ne coda. 3 Liste puntate doppie Una Lista Doppia Puntata è un insieme dinamico in cui ogni elemento ha uno o più campi contenenti informazioni e due riferimenti, uno all elemento successivo (next) della lista ed uno all elemento precedente (prev) della lista. 4 2

Implementazione in C Per definire la struttura di un elemento di una lista doppiamente puntata bisogna utilizzare due puntatori alla stessa struttura. Il primo punterà all elemento precedente mentre il secondo punterà all elemento successivo: struct elemento { struct elemento *prev; int inf; struct elemento *next;} Per l inizializzazione di una lista doppiamente puntata si può considerare il codice visto per l inizializazione delle liste singolarmente puntate, introducendo opportunamente il codice per il puntatore all elemento precedente. Funzione crea_lista() 1/2 La funzione crea_lista() crea due puntatori ad elemento, uno di nome p (puntatore al primo elemento della lista) e l'altro di nome punt (puntatore che permette di scorrere la lista); struct el *crea_lista() { struct el *p, *punt; int i, n; printf("\n Specificare il numero di elementi... "); scanf("%d", &n); prev if(n==0) p p = NULL; punt /* creazione primo elemento */ p = (struct el *)malloc(sizeof(struct el)); printf("\ninserisci il primo valore: "); scanf("%d", &p->inf); punt = p; p->prev=null; inf next 6 3

Funzione crea_lista() 2/2 for(i=2; i<=n; i++) { punt->next = (struct el *)malloc(sizeof(struct el)); punt->next->prev=punt; punt = punt->next; printf("\ninserisci il %d elemento: ", i); scanf("%d", &punt->inf); } // chiudo il for punt->next = NULL; // marcatore fine lista } // chiudo l'if-else return(p); } // chiudo la funzione 7 Inserimento in coda: main() #include <stdio.h> #include <malloc.h> struct el {struct el *prev; int inf; struct el *next;}; struct el *crealista(); int inserisci_in_coda(struct el*,int); int main() { struct el *lista; int valore; lista=crealista(); stampalista(); printf("\ninserisci elemento da inserire: "); scanf("%d", &valore); inserisci_in_coda(lista,valore); } 8 4

Inserimento in coda: funzione void inserisci(struct el *p, int valore) { struct el *nuovo; if (p==null) { p=(struct el *)malloc(sizeof(struct el)); p->inf=valore; p->prev=null; } while (p->next!= NULL) p=p->next; nuovo=(struct el *)malloc(sizeof(struct el)); nuovo->prev=p; nuovo->inf=valore; nuovo->next = NULL; } p->next=nuovo; return; } Liste puntate circolari Una Lista Circolare puntata è un una lista puntata in cui il puntatore next dell ultimo elemento della lista punta all elemento in testa alla lista. Infine, se la lista è doppiamente puntata, il puntatore prev della testa della lista punta all elemento in coda alla lista 10

Funzione crea_lista() 1/2 La funzione crea_lista() crea due puntatori ad elemento, uno di nome p (puntatore al primo elemento della lista) e l'altro di nome punt (puntatore che permette di scorrere la lista); struct el *crea_lista() { struct el *p, *punt; int i, n; printf("\n Specificare il numero di elementi... "); scanf("%d", &n); prev if(n==0) p p = NULL; punt /* creazione primo elemento */ p = (struct el *)malloc(sizeof(struct el)); printf("\ninserisci il primo valore: "); scanf("%d", &p->inf); punt = p; p->prev=null; inf next 11 Funzione crea_lista() 2/2 for(i=2; i<=n; i++) { punt->next = (struct el *)malloc(sizeof(struct el)); punt->next->prev=punt; punt = punt->next; printf("\ninserisci il %d elemento: ", i); scanf("%d", &punt->inf); } // chiudo il for punt->next = p; p->prev = punt; // circolarità della lista } // chiudo l'if-else return(p); } // chiudo la funzione 12 6

Elimina elemento dalla lista struct elemento *togli(struct elemento *p, int valore, int *posizione) { struct elemento *inizio=null; int i=1; if (p!=null) { inizio=p; do { if (p->inf==valore) { *posizione=i; if (p->next==p) inizio=null; p->prev->next=p->next; p->next->prev=p->prev; } free(p); p=null; } p=p->next; i++;} } while (p!=inizio && p!=null); } return inizio; } 13 7