Inserimento in una lista ordinata

Documenti analoghi
LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

Programmazione I - Laboratorio

GLI ALBERI BINARI DI RICERCA. Cosimo Laneve

Esercitazione 11. Liste semplici

Strutture dati dinamiche in C (II)

Laboratorio di Programmazione

Implementazione dell albero binario in linguaggio C++

Strutture Dinamiche. Fondamenti di Informatica

Implementazione ADT: Alberi

Per semplicità eliminiamo le ripetizioni nell'albero.

Alberi Binari di Ricerca

Esercizio 1: funzione con valore di ritorno di tipo puntatore

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

Laboratorio di Informatica

5. Quinta esercitazione autoguidata: liste semplici

In questa lezione Alberi binari di ricerca: la cancellazione

La struttura dati CODA

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

Rappresentazione di liste mediante puntatori in linguaggio C

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

Esercizi su programmazione ricorsiva 1. Pericle Perazzo 23 marzo 2012

Liste a puntatori: un esercizio passo passo

Algoritmi di ordinamento: Array e ricorsione

Esercizi Strutture dati di tipo astratto

6 - Blocchi e cicli. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Esercitazione 6. Alberi binari di ricerca

Algoritmi e Strutture Dati

Hash Table. Hash Table

Alberi. Strutture dati: Alberi. Alberi: Alcuni concetti. Alberi: definizione ricorsiva. Alberi: Una prima realizzazione. Alberi: prima Realizzazione

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

Il linguaggio C. Puntatori e dintorni

Corso di Informatica 1 (IN1) Tutorato n. 11

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

Heap e code di priorità

In questa lezione. Heapsort. ordinamento con complessità, nel caso peggiore, O(nlogn) [CLRS01] cap. 6 da pag. 106 a pag. 114

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

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

Introduzione. Heap-binomiali: un heap binomiale è un insieme di alberi binomiali.

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

APPUNTI LEZIONI PROGRAMMAZIONE II A CURA DELLA PROF.SSA EMANUELA FACHINI. Ricorsione.

I PUNTATORI E LE STRUTTURE DATI DINAMICHE. Cosimo Laneve/Ivan Lanese

n n 1 n = > Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita

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

Albero binario. Alberi binari (introduzione) Terminologia. Alberi di ricerca binaria (BST)

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

Esercizi su alberi binari

Esercizio 1 Liste: calcolo perimetro di un poligono

Alberi binari. Esercizi su alberi binari

Informatica 1. Prova di recupero 21 Settembre 2001

Implementazione di Liste puntate

Lezione 8 Struct e qsort

Alberi. Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo. Fosco.

Strutture dati per insiemi disgiunti (union-find)

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

Problemi di ordinamento

Alberi Binario in Java

Indice PARTE A. Prefazione Gli Autori Ringraziamenti dell Editore La storia del C. Capitolo 1 Computer 1. Capitolo 2 Sistemi operativi 21 XVII XXIX

La Struttura Dati Lista

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

Esercizio 1. E vero che in un AVL il minimo si trova in una foglia o nel penultimo livello? FB = -1. livello 0 FB = -1. livello 1 FB = -1.

Transcript:

Inserimento in una lista ordinata Vogliamo inserire un nuovo elemento in una lista in cui gli elementi sono memorizzati in ordine crescente: Passo 1: creare un nuovo nodo della lista Passo 2: trovare il punto di inserimento Passo 3: realizzare l inserimento modificare i link in modo opportuno 1

Esempio di inserimento A 2 B 25 C 32 D 45 - Poichè A -> elem = 2 < val = 30, B->elem = 25 < val ma C->elem = 32 >= val il punto giusto è tra C e D. Creiamo il nodo da inserire: new 30 2

Esempio inserimento 2 A 2 B 25 C 32 D 45 - C = new new 30 new->next = C 3

Ricorsione su liste concatenate: l esempio dell inserimento di un elemento in una lista ordinata ListaPtr inslistord (ListaPtr L, int val) {/*versione ricorsiva dell'inserimento in una lista ordinata prec: La lista deve essere ordinata in ordine crescente*/ postc: inserisce val nella prima posizione consistente con l'ordine */ ListaPtr new; if (L == NULL (L)->elem >= val) {new = malloc(sizeof(lista)); assert(new); new->elem = val; new->next = L; return new;} else L -> next = inslistord(l->next, val); return L;} versione1 4

esempio esecuzione new 30 A 2 B 25 C 32 D 45 - inslistord (A, 30) /*L=A,L->elem < val L->next = B*/ A -> next = inslistord (B,30) /*L = B, L->elem < val, L->next = C*/ B -> next = inslistord (C,30) /*L=C, L->elem > val*/ if (L == NULL (L)->elem >= val) {new = malloc(sizeof(lista)); assert(new); new->elem = val; new->next = L; return new;} else L -> next = inslistord(l->next, val); return L;} Qui A->next = B Qui B->next = new Restituisce new, con new->next = C, 5

Versione iterativa dell inserimento di un elemento in una lista ordinata versione1 ListaPtr inslistordit (ListaPtr L, int val) {/*versione iterativa dell'inserimento in una lista ordinata prec: La lista deve essere ordinata in ordine crescente postc: inserisce val nella prima posizione consistente con l'ordine */ ListaPtr temp = L,prec = NULL,new; new = malloc(sizeof(lista)); assert(new); new->elem = val; while (temp!= NULL && temp -> elem < val) {prec = temp;temp = temp ->next; } if (prec!= NULL) {prec->next = new; new -> next = temp;} else { new -> next = L; L = new; } return L;} 6

esempio esecuzione new 30 A 2 B 25 C 32 D 45 - inslistordit (A, 30) /*temp=l=a,prec = NULL,temp->elem=2 < val temp->next = B*/ prec = A, temp = B /*temp = B,prec = A, B->elem = 25< val, temp->next = C*/ prec = B, temp = C /*temp=c,prec = B, C->elem = 32 > val*/ while (temp!= NULL && temp -> elem < val) {prec = temp;temp = temp ->next; } if (prec!= NULL) {prec->next = new; new -> next = temp;} else { new -> next = L; L = new; } return L;} Uscita ciclo prec!=null prec -> next ( che è C) diventa new e new ->next = temp (che è C) 7

Confronto ricorsione iterazione Tempo: Ricorsione: si esegue, oltre ai confronti necessari per trovare il punto di inserimento, un numero lineare nel numero degli elementi (caso peggiore) di assegnamenti (al rientro dalle chiamate) Iterazione: si esegue un numero costante di assegnamenti (lo stesso numero di confronti del caso ricorsivo) Spazio: Ricorsione: si occupa uno spazio di memoria per le chiamate lineare nel numero degli elementi (caso peggiore) Iterazione: si occupa uno spazio di memoria costante 8

Ricorsione su liste concatenate: l esempio dell inserimento di un elemento in una lista ordinata versione2 void inslistord2 (ListaPtr *L, int val) {/*versione ricorsiva dell'inserimento in una lista ordinata prec: La lista deve essere ordinata in ordine crescente postc: inserisce val nella prima posizione consistente con l'ordine */ ListaPtr new; if (*L == NULL (*L)->elem >= val) {new = malloc(sizeof(lista)); assert(new); new->elem = val; new->next = *L; *L = new;} else inslistord2(&(*l)->next, val);} 9

esempio esecuzione Ind( X)=x new 30 A 2 B 25 C 32 D 45 - inslistord2 (a, 30) /* L=a,*L = A, A->elem=2 < val */ inslistord2 (b,30) /* L=b, *L = B, B->elem = 25 < val*/ inslistord2 (c,30) /* L=c, *L = C, C->elem > val*/ if (*L == NULL (*L)->elem >= val) {new = malloc(sizeof(lista)); assert(new); new->elem = val; new->next = *L; *L = new;} else inslistord2(&(*l)->next, val);} new->next = C, C = new 10

Versione iterativa dell inserimento di un elemento in una lista ordinata versione2 void inslistordit2 (ListaPtr *L, int val) {/*versione iterativa dell'inserimento in una lista ordinata prec: La lista deve essere ordinata in ordine crescente postc: inserisce val nella prima posizione consistente con l'ordine */ ListaPtr prec = NULL,temp = *L, new; new = malloc(sizeof(lista)); assert(new); new->elem = val; while (temp!= NULL && temp->elem < val) {prec = temp;temp = temp->next;} if (prec!= NULL) {prec->next = new; new -> next = temp;} else { new -> next = *L; *L = new; } } 11

esempio esecuzione Ind( X)=x new 30 A 2 B 25 C 32 D 45 - inslistordit2 (a, 30) /*temp=*l=a, prec = NULL, temp->elem=2 < val temp->next = B*/ prec = A, temp = B /*temp = B, prec = A, B->elem = 25< val, temp->next = C*/ prec = B, temp = C /*temp=c,prec = B, C->elem = 32 > val*/ temp = *L while (temp!= NULL && temp->elem <val) {prec = temp;temp = temp->next;} if (prec!= NULL) {prec->next = new; new -> next = temp;} else { new -> next = *L; *L = new; } } Uscita ciclo prec!=null B -> next (= C) diventa new e new ->next = temp (=C) 12

Confronto ricorsione iterazione, seconda versione Tempo: Sono sostanzialmente equivalenti Spazio: Ricorsione: si occupa uno spazio di memoria per le chiamate lineare nel numero degli elementi (caso peggiore) Iterazione: si occupa uno spazio di memoria costante Ma la funzione è ricorsiva in coda! Quindi può essere trasformata nell iterativa equivalente a tempo di compilazione, risparmiando al programmatore la gestione dei puntatori di scorrimento della lista. 13