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

Documenti analoghi
La programmazione nel linguaggio C

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

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.

Strutture dati dinamiche in C (II)

Programmazione I - Laboratorio

Strutture Dinamiche. Fondamenti di Informatica

Inserimento in una lista ordinata

Laboratorio di Informatica

Laboratorio di Programmazione

Argomenti della lezione. Introduzione agli Algoritmi e alle Strutture Dati. Lista Lineare. Lista Lineare come Tipo di Dato Astratto

public static boolean occorre (int[] a, int n) { int i = 0; boolean trovato = false;

Algoritmi e Strutture Dati

Esercizi su strutture dati

Organigramma Gerarchia. (Tree) Nessuna persona può avere più di un superiore Ogni persona può essere superiore di altre

Heap e code di priorità

5. Quinta esercitazione autoguidata: liste semplici

Rappresentazione collegata mediante puntatori di una lista

Alberi ed Alberi Binari

Strutture dati. Le liste

PROVA SCRITTA 23 MARZO 2010

Alberi e alberi binari I Un albero è un caso particolare di grafo

Rappresentazione di liste mediante puntatori in linguaggio C

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Parte 4. Liste. P. Picasso Guernica, AA. 2015/16

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

Esercizi su programmazione ricorsiva 1. Pericle Perazzo 23 marzo 2012

Liste con sentinella. intlist *createlist(void){ intlist *q = malloc(sizeof(intlist)); if(!q) { exit(-1); } q->next = q->prev = q; return q; }

Per semplicità eliminiamo le ripetizioni nell'albero.

Le liste. ADT e strutture dati per la rappresentazione di sequenze. Ugo de' Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 5

Informatica 3. Informatica 3. LEZIONE 13: Liste doppie, pile e code. Lezione 13 - Modulo 1. Free list (2) Free list. Free list

Laboratorio di Algoritmi e Strutture Dati. Code con Priorità

PILE E CODE. Pile (stack):

Sommario. Le strutture dati elementari per implementare sequenze: Vettori Liste

Fondamenti di Informatica

Algoritmi e Strutture di Dati I 1. Algoritmi e Strutture di Dati I Massimo Franceschet francesc

Esercizio 1: funzione con valore di ritorno di tipo puntatore

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

Esercitazione 11. Liste semplici

Fondamenti di Informatica II

CORSO DI PROGRAMMAZIONE

char* titolo= Libreria sulle stringhe Esempi: (strcpy) (strstr)... Laboratorio di Informatica L-A 1

Esercitazione 6. Alberi binari di ricerca

Le liste con array. Rimuovere la perla rossa costringe a spostare molte altre perle. Dove mettere la perla verde se si è esaurito il filo?

FUNZIONI che operano su LISTE

Corso di Fondamenti di Programmazione canale E-O. Un esempio. Funzioni ricorsive. La ricorsione

Algoritmi e strutture dati

Programmazione 1 A.A. 2015/2016

LA RICORSIONE IN C. CdL Ingegneria Informatica n.o. Anno Accademico 2006/07 Fondamenti di Informatica I corso A Giacomo Piscitelli pag.

Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento

s r t i r n i g n. g h s r t c r p c y s r t c r a c t s r t c r m c p s r t c r h c r s r t s r t s r

Informatica/ Ing. Meccanica/ Edile/ Prof. Verdicchio/ 17/01/2014/ Foglio delle domande / VERSIONE 1

Appunti di informatica. Lezione 10 anno accademico Mario Verdicchio

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni

Iterazione. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa E07. C. Limongelli Novembre 2007

ALBERI DI RICERCA BINARI (O ALBERI BINARI DI RICERCA)

Liste Doppiamente Collegate

Tipi astratti pila e coda

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

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

liste ogni nodo ha un successore, tranne l ultimo della lista che ne ha zero; alberi binari ogni nodo ha zero, uno oppure due figli

Grafi: visita generica

La Struttura Dati Pila

string.h strcpy strc strcat strcmp strcmp strchr strstr strstr i t r ; s r \0 int strlen(char* str) char pippo[]={ p, i, p, p, o, \0 \ };

Informatica 3. LEZIONE 12: Liste. Modulo 1: ADT lista e implementazione basata su array Modulo 2: Lista concatenata

Il linguaggio C Strutture

Implementazione dell albero binario in linguaggio C++

Pile Le pile: specifiche e realizzazioni attraverso rappresentazioni sequenziali e collegate. Pile e procedure ricorsive

Un esempio di mutua ricorsione

Struttura di dati lista concatenata

Heap scenario. Ho un insieme dinamico di oggetti, ciascuno identificato con una priorità. (la priorità è semplicemente un numero);

dott. Sabrina Senatore

Verso i puntatori: Cosa è una variabile?

Fondamenti di Informatica T-1 Modulo 2

Implementazione ADT: Alberi

La Struttura Dati Lista

Esercizi Strutture dati di tipo astratto

Strutture Dati Dinamiche

Corso di Fondamenti di Informatica. La ricorsione

PUNTATORI A STRUTTURE

La struttura dati CODA

GLI ALBERI BINARI DI RICERCA. Cosimo Laneve

3. un metodo che restituisce l elenco delle matricole di tutti gli studenti del corso;

Esercizi. Stringhe. Stringhe Ricerca binaria

Strutture fisiche e strutture di accesso ai dati

Algoritmi di Ricerca. Esempi di programmi Java

Coda su lista concatenata

Lezione 7 Alberi binari: visite e alberi di ricerca

Strutture dati. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05

Il TDA Dictionary. Definizione informale. I metodi del TDA Dictionary 1. Applicazioni. I metodi del TDA Dictionary 2. I metodi del TDA Dictionary 3

Programmazione a blocchi. Algobuild Prof. Sergio Roselli

Alberi Binario in Java

Esempi di Problemi Iterativi

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Array. Maurizio Palesi Salvatore Serrano. In C si possono definire tipi strutturati Vi sono due costruttori fondamentali

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

Questa soluzione va contemplata quando le lunghezze stimate dalle liste usate sono significativamente maggiori delle dimensioni di un elemento.

Hash Table. Hash Table

Fondamenti di Programmazione

Il tipo astratto coda con priorità: specifiche sintattiche e semantiche. Realizzazioni.

Transcript:

Inserimento di un elemento in coda Se la è vuota coincide con l inserimento in testa = è necessario il passaggio per indirizzo! Se la non è vuota, bisogna scandirla fino in fondo = dobbiamo usare un puntatore ausiliario per la scansione La scansione deve terminare in corrispondenza dell ultimo elemento al quale va collegato quello nuovo ultimo * 8 3 aux Dott. R. Gori, Prof. A. Corradini, Dott. A. Rama INFORMATICA 242AA a.a. 2010/11 pag. 44 Inserimento di un elemento in coda Se la è vuota coincide con l inserimento in testa = è necessario il passaggio per indirizzo! Se la non è vuota, bisogna scandirla fino in fondo = dobbiamo usare un puntatore ausiliario per la scansione La scansione deve terminare in corrispondenza dell ultimo elemento al quale va collegato quello nuovo ultimo * 8 3 aux Dott. R. Gori, Prof. A. Corradini, Dott. A. Rama INFORMATICA 242AA a.a. 2010/11 pag. 446

Inserimento di un elemento in coda Se la è vuota coincide con l inserimento in testa = è necessario il passaggio per indirizzo! Se la non è vuota, bisogna scandirla fino in fondo = dobbiamo usare un puntatore ausiliario per la scansione La scansione deve terminare in corrispondenza dell ultimo elemento al quale va collegato quello nuovo ultimo * 8 3 aux Dott. R. Gori, Prof. A. Corradini, Dott. A. Rama INFORMATICA 242AA a.a. 2010/11 pag. 447 Inserimento di un elemento in coda Se la è vuota coincide con l inserimento in testa = è necessario il passaggio per indirizzo! Se la non è vuota, bisogna scandirla fino in fondo = dobbiamo usare un puntatore ausiliario per la scansione La scansione deve terminare in corrispondenza dell ultimo elemento al quale va collegato quello nuovo ultimo * 8 3 aux Dott. R. Gori, Prof. A. Corradini, Dott. A. Rama INFORMATICA 242AA a.a. 2010/11 pag. 448

Codice della versione iterativa void InserzioneInCoda(ListaDiElementi *, TipoElementoLista elem) ListaDiElementi ultimo; /* puntatore usato per la scansione */ ListaDiElementi aux; /* creazione del nuovo elemento */ aux = malloc(sizeof(elementolista)); aux->info = elem; aux->next = NULL; if (* == NULL) * = aux; ultimo = *; while (ultimo->next!= NULL) ultimo = ultimo->next; /* concatenazione del nuovo elemento in coda alla */ ultimo->next = aux; Dott. R. Gori, Prof. A. Corradini, Dott. A. Rama INFORMATICA 242AA a.a. 2010/11 pag. 449 Inserimento ricorsivo di un elemento in coda Caratterizzazione induttiva dell inserimento in coda Sia nuovalista la ottenuta inserendo elem in coda a. 1. se è vuota, allora nuovalista è costituita dal solo elem (caso base) 2. altrimenti nuovalista è ottenuta da facendo l inserimento di elem in coda al resto di (caso ricorsivo) Esercizio: Scrivere il codice corrispondente. Dott. R. Gori, Prof. A. Corradini, Dott. A. Rama INFORMATICA 242AA a.a. 2010/11 pag. 40

Cancellazione della prima occorrenza di un elemento si scandisce la alla ricerca dell elemento se l elemento non compare non si fa nulla altrimenti, a seconda di dove si trova l elemento, si distinguono tre casi 1. l elemento è il primo della : si aggiorna il puntatore iniziale in modo che punti all elemento successivo = passaggio per indirizzo!! 2. l elemento non è né il primo né l ultimo: si aggiorna il campo next dell elemento che precede quello da cancellare in modo che punti all elemento che segue 3. l elemento è l ultimo: come (2), solo che il campo next dell elemento precedente viene posto a NULL in tutti e tre i casi bisogna liberare la memoria occupata dall elemento da cancellare Dott. R. Gori, Prof. A. Corradini, Dott. A. Rama INFORMATICA 242AA a.a. 2010/11 pag. 41 Osservazioni: per poter aggiornare il campo next dell elemento precedente, bisogna fermare la scansione sull elemento precedente (e non su quello da cancellare) precedente 8 3 per fermare la scansione dopo aver trovato e cancellato l elemento, si utilizza una sentinella booleana Dott. R. Gori, Prof. A. Corradini, Dott. A. Rama INFORMATICA 242AA a.a. 2010/11 pag. 42

void CancellaElementoLista(ListaDiElementi *, TipoElementoLista elem) ListaDiElementi prec; /* puntatore all elemento precedente */ ListaDiElementi corr; /* puntatore all elemento corrente */ boolean trovato; /* usato per terminare la scansione */ if (*!= NULL) if ((*)->info==elem) /* cancella il primo elemento */ CancellaPrimo(); /* scansione della e cancellazione dell elemento */ prec = *; corr = prec->next; trovato = false; while (corr!= NULL &&!trovato) if (corr->info == elem) /* cancella l elemento */ trovato = true; /* provoca l uscita dal ciclo */ prec->next = corr->next; free(corr); prec = prec->next; /* avanzamento dei due puntatori */ corr = corr->next; Dott. R. Gori, Prof. A. Corradini, Dott. A. Rama INFORMATICA 242AA a.a. 2010/11 pag. 43 Versione ricorsiva: void CancellaElementoLista(ListaDiElementi *, TipoElementoLista elem) if (*!= NULL) if ((*)->info== elem) /* cancella il primo elemento */ CancellaPrimo(); /* cancella elem dal resto */ CancellaElementoLista(&((*)->next), elem); Dott. R. Gori, Prof. A. Corradini, Dott. A. Rama INFORMATICA 242AA a.a. 2010/11 pag. 44

Cancellazione di tutte le occorrenze di un elemento Versione iterativa analoga alla cancellazione della prima occorrenza però, dopo aver trovato e cancellato l elemento, bisogna continuare la scansione ci si ferma solo quando si è arrivati alla fine della = non serve la sentinella booleana per fermare la scansione Dott. R. Gori, Prof. A. Corradini, Dott. A. Rama INFORMATICA 242AA a.a. 2010/11 pag. 4 Cancellazione di tutte le occorrenze di un elemento Caratterizzazione induttiva Sia ris la ottenuta cancellando tutte le occorrenze di elem da. Allora: 1. se è la vuota, allora ris è la vuota (caso base) 2. altrimenti, se il primo elemento di è uguale ad elem, allora ris è ottenuta da cancellando il primo elemento e tutte le occorrenze di elem dal resto di (caso ricorsivo) 3. altrimenti ris è ottenuta da cancellando tutte le occorrenze di elem dal resto di (caso ricorsivo) Esercizio Implementare le due versioni Dott. R. Gori, Prof. A. Corradini, Dott. A. Rama INFORMATICA 242AA a.a. 2010/11 pag. 46

Versione iterativa void CancellaTuttiLista(ListaDiElementi *, TipoElementoLista elem) ListaDiElementi prec; /* puntatore all elemento precedente */ ListaDiElementi corr; /* puntatore all elemento corrente */ boolean trovato = false; while ((*!= NULL) &&!trovato) /* cancella le occorrenze */ if ((*)->info!=elem) /* di elem in testa */ trovato = true; CancellaPrimo(); if (*!= NULL) prec = *; corr = prec->next; while (corr!= NULL) if (corr->info == elem) /* cancella l elemento */ prec->next = corr->next; free(corr); corr = prec->next; prec = prec->next; /* avanzamento dei due puntatori */ corr = corr->next; Dott. R. Gori, Prof. A. Corradini, Dott. A. Rama INFORMATICA 242AA a.a. 2010/11 pag. 47 Versione ricorsiva void CancellaTuttiLista(ListaDiElementi *, TipoElementoLista elem) ListaDiElementi aux; if (*!= NULL) if ((*)->info==elem) /* cancellazione del primo elemento */ CancellaPrimo(); /* cancellazione di elem dal resto della */ CancellaTuttiLista(, elem); CancellaTuttiLista(&((*)->next), elem); Dott. R. Gori, Prof. A. Corradini, Dott. A. Rama INFORMATICA 242AA a.a. 2010/11 pag. 48

Inserimento di un elemento in una ordinata Data una (ad es. di interi) già ordinata (in ordine crescente), si vuole inserire un nuovo elemento mantenendo l ordinamento. Versione iterativa: per esercizio Versione ricorsiva Caratterizziamo il problema induttivamente Sia ris la ottenuta inserendo l elemento elem nella ordinata. 1. se è la vuota, allora ris è costituita solo da elem (caso base) 2. se il primo elemento di è maggiore o uguale a elem, allora ris è ottenuta da inserendo elem in testa (caso base) 3. altrimenti ris è ottenuta da inserendo ordinatamente elem nel resto di (caso ricorsivo) Dott. R. Gori, Prof. A. Corradini, Dott. A. Rama INFORMATICA 242AA a.a. 2010/11 pag. 49 void InserzioneOrdinata(ListaDiElementi *, int elem) if (* == NULL) InserisciTestaLista(, elem); if ((*) --> info >= elem) InserisciTestaLista(, elem); InserzioneOrdinata(&((*)->next), elem); Dott. R. Gori, Prof. A. Corradini, Dott. A. Rama INFORMATICA 242AA a.a. 2010/11 pag. 460

InserzioneOrdinata(&Lista1, 10) PILA HEAP 8 Lista1 Dott. R. Gori, Prof. A. Corradini, Dott. A. Rama INFORMATICA 242AA a.a. 2010/11 pag. 461 InserzioneOrdinata(&Lista1, 10) PILA HEAP 8 Lista1 Dott. R. Gori, Prof. A. Corradini, Dott. A. Rama INFORMATICA 242AA a.a. 2010/11 pag. 462

InserzioneOrdinata(&Lista1, 10) PILA HEAP 8 Lista1 Dott. R. Gori, Prof. A. Corradini, Dott. A. Rama INFORMATICA 242AA a.a. 2010/11 pag. 463 InserzioneOrdinata(&Lista1, 10) PILA HEAP 8 Lista1 Dott. R. Gori, Prof. A. Corradini, Dott. A. Rama INFORMATICA 242AA a.a. 2010/11 pag. 464

InserzioneOrdinata(&Lista1, 10) PILA HEAP Lista1 8 10 Dott. R. Gori, Prof. A. Corradini, Dott. A. Rama INFORMATICA 242AA a.a. 2010/11 pag. 46 void InserzioneOrdinata(ListaDiElementi *, int elem) if (* == NULL) InserisciTestaLista(, elem); if ((*) --> info >= elem) InserisciTestaLista(, elem); prec = *; corr = prec -> next; trovato = false; while (corr!=null &&!trovato) if (corr -> info >= elem) trovato = true; prec = prec -> next; corr = corr -> next; aux = malloc(sizeof(elementolista)); aux -> info = elem; prec -> next = aux; aux -> next = corr; Dott. R. Gori, Prof. A. Corradini, Dott. A. Rama INFORMATICA 242AA a.a. 2010/11 pag. 466