La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Algoritmi e Strutture Dati

Presentazioni simili


Presentazione sul tema: "Algoritmi e Strutture Dati"— Transcript della presentazione:

1 Algoritmi e Strutture Dati
Università di Camerino Corso di Laurea in Informatica (12 CFU) I periodo didattico LISTE Emanuela Merelli

2 Strutture Dati Dinamiche
Una struttura dati si dice essere dinamica se permette di rappresentare insiemi dinamici, cioè insiemi la cui cardinalità varia durante l’esecuzione del programma. Esamineremo Strutture dati dinamiche che utilizzano puntatori.

3 I puntatori Distinguiamo:
Tipo del puntatore Tp definito tramite un altro tipo T Variabile di tipo puntatore P:Tp Variabile dinamica new(P) Non vengono dichiarate esplicitamente Non vengono identificate esplicitamente tramite un identificatore Vengono create dinamicamente in base alle necessità che emergono nel corso del programma Vengono referenziate tramite una variabile di tipo puntatore, che rappresenta indirettamente l’indirizzo della variabile in memoria La loro esistenza è indipenedente dal blocco in cui sono state create La dichiarazione di una variabile di tipo puntatore, all’atto della compilazione, non alloca memoria per l’oggetto di tipo T. Il comando New allocherà memoria per l’oggetto di tipo T NIL è il valore che indica puntatore non definito valido per tutti i tipi di puntatori

4 Liste Le Liste possono essere Lineari e NON Lineari Lista Lineare:
è un insieme ordinato di n elementi, tutti dello stesso tipo, ogni elemento ha un predecessore e un successore Lista Non Lineare: è una lista ogni elemento può essere a sua volta una lista A B C E A D E B C

5 Lista Lineare è un insieme ordinato di n elementi, tutti dello stesso tipo, ogni elemento ha un predecessore e un successore Proprietà: X1 è il primo elemento della lista Xi è preceduto da xi-1 e seguito da xi+1 Xn è l’ultimo elemento della lista N= lunghezza della lista N=0  Lista Vuota A B C E D L(A, B, C, D) Relazione di precedenza: per accedere ad un elemento si deve accedere a tutti quelli che lo precedono

6 Lista Non Lineare è una lista, ogni elemento può essere a sua volta una lista A D E B C L(D (C ( A, B), E))

7 Lista Lineare come Tipo di Dato Astratto
Dominio dei valori Insieme dinamico basato su un elemento omogeneo Operazioni su Lista Lineare Inserire un elemento in testa Inserire un elemento in coda Inserire un elemento dopo un elemento puntato da P Creare una lista con N elementi ….

8 Operazioni definite su Lista
Creazione di un nuovo elemento CreaEl(R,X) Inserimento di un elemento in testa InsTesta(R,E) Inserimento di un elemento in coda InsCoda(R,E) Inserimento di un elemento dopo P Inserisci(P,E) Eliminazione dell’elemento in testa ElimTesta(R) Eliminazione di un elemento in coda ElimCoda(R) Eliminazione di un elemento dopo P Elimina(P) Scansione della lista Scansione(R) Creazione di una lista di N elementi CreaT(R,N) Creazione di una lista di N elementi CreaC(R,N)

9 Operazioni su Liste Lineari
Inserimento di un elemento in Testa alla Lista Struttura Dati Sequenza ordinata di elementi di tipo record formati da due campi, un campo informazione e un campo puntatore ad elemento. Struttura dati dinamica Utilizzo del tipo puntatore Lista d’input Inizio B C D E Nuovo elemento A Lista d’output A B C E D Inizio

10 Inserimento di un elemento in testa
Algoritmo Creare il nuovo elemento Memorizzare l’informazione nel nuovo elemento Collegare il nuovo elemento in testa alla lista esistente Il campo puntatore del nuovo elemento assume il valore di inizio lista Inizio lista assume il valore del nuovo elemento Lista d’input Inizio B C D E Nuovo elemento A Lista d’output A B C E D Inizio

11 Operazioni su Liste Lineari
Inserimento di un elemento in Testa alla Lista Type T = RECORD Inf : Integer; Next : TP; END; Pun =  T; Var Primo: Pun; A: T; Procedura Testa (Var Inizio: Pun, X: Integer) Var Q: Pun; Begin New(Q); Q.Inf := X; Q.Next := Inizio; Inizio:= Q; Lista d’input Inizio B C D E Nuovo elemento A Lista d’output A B C E D

12 Eliminazione dell’elemento in testa ad una lista
Type T = RECORD Inf : Integer; Next : TP; END; Pun =  T; Var Primo: Pun; A: T; Procedura ElimTesta (Var Inizio: Pun) Begin IF Inizio <> NIL THEN Inizio:= Inizio.Next; Lista d’input Inizio A B C E D Elemento eliminato A Lista d’output B C E D Inizio

13 Inserimento di un elemento in coda
Procedura Coda (Var Inizio: Pun, X: Integer) Var P, Q: Pun; Begin New(Q); Q.Next := NIL; Q.Inf := X; P:= Inizio; IF Inizio=NIL THEN Inizio:=Q ELSE Begin WHILE P.Next <> NIL DO P:=P.Next; P.Next:=Q; END; Lista d’input Inizio A B C D Nuovo elemento E Lista d’output A B C E D

14 Inserimento di un elemento dopo un elemento puntato da P
Algoritmo Creazione del nuovo elemento Memorizzazione dell’informazione nel nuovo elemento Poiché siamo nell’ipotesi che l’elemento esiste ed è puntato da P, allora si può collegare il nuovo elemento tramite il campo NEXT dell’elemento puntato da P Lista d’input Inizio P A B C D Nuovo elemento E Lista d’output A B C E D

15 Domanda Perché il parametro Inizio della procedura Coda, deve essere passato per riferimento? E’ possibile definire un algoritmo con il parametro Inizio passato per valore? Se si, quali modifiche o ipotesi vanno fatte?

16 Inserimento di un elemento dopo un elemento puntato da P
Procedura Inserisci (Var P: Pun, X: Integer) Var Q: Pun; Begin New(Q); Q.Inf := X; Q.Next:= P.Next; P.Next:=Q; END; Lista d’input P A B D E Nuovo elemento C Lista d’output A B C E D

17 Creazione di una lista di N elementi
Procedura Crea (Var Inizio: Pun, N: Integer) Var P, Q: Pun; Begin Inizio:= NIL; WHILE N>0 DO New(Q); Q.Next := Inizio; Inizio:= Q; Q.Inf:=N; N:= N-1 END; 3 345 9 5 23

18 Scansione di una lista lineare
Algoritmo Controllare se la lista è vuota, che equivale a controllare se il puntatore alla lista è uguale a NIL Se Inizio lista uguale a NIL fine scansione, altrimenti si va al passo 3. Se Inizio lista è diverso da NIL, Visita del primo elemento della lista Far avanzare di un elemento il puntatore di inizio lista. Ricominciare dal passo 1. 3 345 9 5 23

19 Scansione di una lista lineare
Procedura Scansione (Var Inizio: Pun) Begin WHILE Inizio <> NIL DO Writeln(Inizio.Inf); Inizio:= Inizio.Next; End; 3 345 9 5 23

20 Esercizio 1 Data un elenco di parole, si vuole costruire una Lista Ordinata contenente un elemento per ogni distinta parola. Il generico elemento della Lista conterrà un campo informazione (la parola) e un contatore che indicherà il numero di occorrenze della parola nell’elenco.

21 Homework Definire una Funzione Testa di tipo puntatore che prenda in input un valore X e restituisca Testa con X come primo elemento

22 Inserimento in una Lista Ordinata ognuno contenente come informazione una parola e un intero n
Soluzione Un’ovvia soluzione è costruire una lista delle parole trovate nell’elenco. La lista viene letta per ogni parola. Se la parola viene trovata, il contatore della sua frequenza viene incrementato; altrimenti la parola viene aggiunta alla lista. I casi da considerare sono: Lista vuota L’elemento esiste, quindi il contatore deve essere incrementato L’elemento non esiste e deve essere inserito in testa deve essere inserito dopo P deve essere inserito in coda

23 Inserimento in una lista Ordinata ognuno contenente come informazione una parola e un intero n
Definire un algoritmo il più possibile generale I possibili casi da considerare sono: Lista vuota  l’elemento è inserito in testa Lista non vuota Si cerca l’elemento L’elemento esiste nella lista  si incrementa il contatore L’elemento non esiste È il più piccolo  deve essere inserito in testa È compreso tra due valori  deve essere inserito dopo P È il più grande  deve essere inserito in coda

24 Inserimento in Liste Ordinate
Type Pun = Parola; Parola = RECORD Inf : Stringa; Conta: Integer Next : Pun; END; Var K: Stringa; Radice:Pun; Procedura Ricerca (Var Inizio: Pun, X: stringa) Var W1,W2 : Pun; Begin W2:= Inizio; W1:=W2 .Next; IF W1 = NIL THEN Inserisci (NIL) ELSE WHILE (W1.Inf < X AND (W1.Next <> NIL) DO Begin W2:=W1; W1:=W1 .Next End; IF W1.Inf = X THEN W1 . Conta:= W1 .Conta+1 ELSE Begin IF W1.Next:= NIL THEN Begin W2:=W1; W1:= NIL End Inserisci (W1) Procedura Inserisci (W:Pun) Var W3: Pun; New (W3); W3.Inf:= X; W3 .Conta:°= 1; W3 .Next:=W End ; New(Radice); Radice .Next=NIL; Read(X); While K <> “Fine” DO Begin Ricerca(Radice, K) Read(K) End; End.

25 Ricerca di un elemento in una Lista
Algoritmo HP1: gli elementi sono memorizzati in un Lista non ordinata Controllare se la lista è vuota Scansione della Lista Elemento trovato Raggiunta fine lista Domanda La lista è ordinata o no? Lista d’input Z B C E D C Elemento da trovare

26 Ricerca di un elemento in una Lista non ordinata
Function Ricerca (Var Inizio: Pun, X: Info): Boolean Var Q: Pun; B:Boolean; Begin Q:=Inizio; B:=true; WHILE Q<>NIL AND B DO IF Q.Inf:=X THEN B:= false ELSE Q:=Q.Next If B then Ricerca:=false ELSE Ricerca:=true END; Lista d’input A B C E D C Elemento da trovare

27 Osservazioni sulla Condizione While
HP: B= true elemento non trovato Q<>NIL scansione non terminata Q<>NIL AND B  elemento non trovata e la lista non è vuota, quindi continuare la scansione B=true Q.inf=X Q=A.next B=false false true B Q<>NIL B and (Q<>NIL) continua elemento trovato, non abbiamo raggiunto la fine elemento non trovato, abbiamo raggiunto la fine non si verifica mai, PERCHÉ?

28 Ricerca di un elemento in una Lista ordinata
Function Ricerca (Var Inizio: Pun, X: Info): Boolean Var Q: Pun; B:Boolean; Begin Q:=Inizio; B:=true; WHILE Q<>NIL AND b DO IF Q.Inf >=X THEN B:= false ELSE Q:=Q.Next If B then Ricerca:=false ELSE If Q.Inf=X THEN Ricerca:=true ELSE Ricerca:=false END;

29 Eliminazione di un elemento da una Lista
Esercizio Definire un algoritmo che elimini un elemento contenente un informazione X dalla Lista Casi possibili: Elemento in test Elemento in coda Elemento tra due elementi

30 Homework Come varia l’algoritmo precedentemente descritto, se si vuole creare direttamente il nuovo elemento utilizzando il campo puntatore dell’ultimo elemento della lista

31 Creazione di una lista di N elementi ognuno contenente come informazione l’intero n
Algoritmo HP1: gli elementi creati vengono inseriti in testa alla Lista HP2: la lista è ordinata in ordine crescente da 1 a N Inizializzazione di Inizio Creazione iterativa di un nuovo elemento Memorizzazione dell’informazione nel nuovo elemento Inserimento in testa alla Lista Lista d’input Inizio Lista d’output Inizio 1 2 N-2 N N-1

32 Creazione di una lista di N elementi inserimento in testa
Procedura CreaT (Var Inizio: Pun, N: Integer) Var Q: Pun; Begin Inizio:= NIL; WHILE N>0 DO New(Q); Q.Next := Inizio; Inizio:= Q; Q.Inf:=N; N:= N-1 END; 1 2 N-2 N N-1

33 Homework Utilizzare la funzione inserisci in testa all’interno della procedura CreaLista Fare le necessarie considerazioni sul passaggio dei parametri tra le procedure e le utili riflessioni sulle caratteristiche dell’ambiente locale e globale …

34 Creazione di una lista di N elementi inserimento in coda
Algoritmo 1 HP1: gli elementi creati vengono inseriti in coda alla Lista HP2: la lista è ordinata in ordine decrescente da 1 a N Inizializzazione di Inizio Creazione del primo elemento in testa e memorizzazione dell’informazione Creazione iterativa di un nuovo elemento Memorizzazione dell’informazione nel nuovo elemento Inserimento in coda alla Lista (l’inserimento in coda implica la scansione della lista) Lista d’input Inizio Lista d’output Inizio N-1 3 1 2 N

35 Creazione di una lista di N elementi inserimento in coda
Procedura CreaC (Var Inizio: Pun, N: Integer) Var P, Q: Pun; Begin IF N = 0 THEN Inizio:=NIL ELSE new(Inizio); Inizio.Inf:=N Inizio.Next:=NIL WHILE N>1 DO New(Q); Q.Inf:=N-1; Q.Next:=NIL; P:= Inizio; WHILE P.Next <> NIL DO P:=P.Next; P.Next:=Q; N:= N-1 End; End END; N-1 3 1 2 N Inizio

36 Creazione di una lista di N elementi inserimento in coda
Algoritmo 1 Ottimizzato HP1: gli elementi creati vengono inseriti in coda alla Lista HP2: la lista è ordinata in ordine decrescente da 1 a N Inizializzazione di Inizio Creazione del primo elemento in testa e memorizzazione dell’informazione Creazione iterativa di un nuovo elemento Memorizzazione dell’informazione nel nuovo elemento Inserimento in coda alla Lista utilizzando un puntatore che punta sempre all’ultimo elemento Lista d’input Inizio Lista d’output Inizio N-1 3 1 2 N

37 Creazione di una lista di N elementi inserimento in coda
Procedura CreaC (Var Inizio: Pun, N: Integer) Var P, Q: Pun; Begin IF N = 0 THEN Inizio:=NIL ELSE new(Inizio); Inizio.Inf:=N Inizio.Next:=NIL P:= Inizio; WHILE N>1 DO New(Q); Q.Inf:=N-1; Q.Next:=NIL; P.Next:=Q; P:=P.Next; N:= N-1 End; End END; N-1 3 1 2 N Inizio

38 Creazione di una lista di N elementi inserimento in coda
Algoritmo 2 HP1: gli elementi creati vengono inseriti in coda alla Lista HP2: la lista è ordinata in ordine decrescente da 1 a N Inizializzazione di Inizio Creazione iterativa di un nuovo elemento Memorizzazione dell’informazione nel nuovo elemento Se Lista Vuota Inserisci in Testa altrimenti Inserimento in coda alla Lista (l’inserimento in coda implica la scansione della lista) Lista d’input Inizio Lista d’output N-1 3 1 2 N Inizio

39 Creazione di una lista di N elementi inserimento in coda
Procedura CreaC (Var Inizio: Pun, N: Integer) Var P,Q: Pun; Begin Inizio:= NIL; WHILE N>0 DO New(Q); Q.Inf:=N; Q.Next:=Nil; P:= Inizio; IF Inizio=NIL THEN Inizio:=Q ELSE WHILE P.Next <> NIL DO P:=P.Next; P.Next:=Q; End; N:= N-1 END; N-1 3 1 2 N Inizio

40 Creazione di una lista di N elementi inserimento in coda
Algoritmo 3 HP1: gli elementi creati vengono inseriti in coda alla Lista HP2: la lista è ordinata in ordine decrescente da 1 a N Inizializzazione di Inizio Creazione di un elemento Testa fittizio Creazione iterative di elementi Memorizzazione dell’informazione nel nuovo elemento Inserimento in coda alla Lista (l’inserimento in coda implica la scansione della lista) Lista d’input Inizio Lista d’output Inizio N 3 1 2 Per generalizzare l’inserimento si utilizza un elemento testa fittizio

41 Creazione di una lista di N elementi inserimento in coda
Procedura CreaC (Var Inizio: Pun, N: Integer) Var P,Q: Pun; Begin new(Inizio); Inizio .Next:=Nil; WHILE N>0 DO New(Q); Q.Inf:=N; Q.Next:=Nil; P:= Inizio; WHILE P.Next <> NIL DO P:=P.Next; P.Next:=Q; N:= N-1 End; END; Inizio 1 N-2 N N-1

42 Creazione di una lista di N elementi inserimento in coda
CONFRONTO tra ALGORITMI Algoritmo 1  tratta la prima creazione come caso particolare Algoritmo 2  ad ogni creazione controlla se è la prima Algoritmo 3  utilizza un elemento testa fittizio per generalizzare la creazione Tutti e 3 gli algoritmi effettuano una scansione della lista L’utilizzo di un puntatore che punti sempre all’ultimo elemento potrebbe far risparmiare la scansione

43 Homework Calcolare la complessità computazionale dei tre algoritmi e stabilire qual è il migliore e in quale contesto

44 Esercizio 1 Dato un elenco di parole (testo), si vuole costruire una Lista Ordinata contenente un elemento per ogni distinta parola. Il generico elemento della Lista conterrà un campo informazione (la parola) e un contatore che indicherà il numero di occorrenze della parola nell’elenco.

45 Inserimento in una Lista Ordinata ognuno contenente come informazione una parola e un intero n
Soluzione Un’ovvia soluzione è costruire una lista delle parole trovate nell’elenco. La lista viene letta per ogni parola. Se la parola viene trovata, il contatore della sua frequenza viene incrementato; altrimenti la parola viene aggiunta alla lista. I casi da considerare sono: Lista vuota L’elemento esiste, quindi il contatore deve essere incrementato L’elemento non esiste e deve essere inserito in testa deve essere inserito dopo P deve essere inserito in coda

46 Inserimento in una lista Ordinata ognuno contenente come informazione una parola e un intero n
Definire un algoritmo il più possibile generale I possibili casi da considerare sono: Lista vuota  l’elemento è inserito in testa Lista non vuota Si cerca l’elemento L’elemento esiste nella lista  si incrementa il contatore L’elemento non esiste È il più piccolo  deve essere inserito in testa È compreso tra due valori  deve essere inserito dopo P È il più grande  deve essere inserito in coda

47 Ricerca di un elemento in una Lista
Algoritmo HP1: gli elementi sono memorizzati in un Lista non ordinata Controllare se la lista è vuota Scansione della Lista Elemento trovato Raggiunta fine lista Domanda La lista è ordinata o no? Lista d’input Z B C E D C Elemento da trovare

48 Ricerca di un elemento in una Lista non ordinata
Function Ricerca (Var Inizio: Pun, X: Info): Boolean Var Q: Pun; B:Boolean; Begin Q:=Inizio; B:=true; WHILE Q<>NIL AND B DO IF Q.Inf:=X THEN B:= false ELSE Q:=Q.Next If B then Ricerca:=false ELSE Ricerca:=true END; Lista d’input A B C E D C Elemento da trovare

49 Osservazioni sulla Condizione While
HP: B= true elemento non trovato Q<>NIL scansione non terminata Q<>NIL AND B  elemento non trovata e la lista non è vuota, quindi continuare la scansione B=true Q.inf=X Q=A.next B=false false true B Q<>NIL B and (Q<>NIL) continua elemento trovato, non abbiamo raggiunto la fine elemento non trovato, abbiamo raggiunto la fine non si verifica mai, PERCHÉ?

50 Ricerca di un elemento in una Lista ordinata
Function Ricerca (Var Inizio: Pun, X: Info): Boolean Var Q: Pun; B:Boolean; Begin Q:=Inizio; B:=true; WHILE Q<>NIL AND b DO IF Q.Inf >=X THEN B:= false ELSE Q:=Q.Next If B then Ricerca:=false ELSE If Q.Inf=X THEN Ricerca:=true ELSE Ricerca:=false END;

51 Homework Definire una funzione di tipo puntatore che restituisca il valore NIL se l’elemento non esiste e restituisca il puntatore all’elemento con informazione X se esiste

52 Inserimento in Liste Ordinate
Type stringa = … Pun = Parola; Parola = RECORD Inf : Stringa; Conta: Integer Next : Pun; END; Var K: Stringa; Radice:Pun; Procedura Ricerca (Var Inizio: Pun, X: stringa) Var W1,W2 : Pun; Begin W2:= Inizio; W1:=W2 .Next; IF W1 = NIL THEN Inserisci (NIL) ELSE WHILE (W1.Inf < X AND (W1.Next <> NIL) DO Begin W2:=W1; W1:=W1 .Next End; IF W1.Inf = X THEN W1 . Conta:= W1 .Conta+1 ELSE Begin IF W1.Next:= NIL THEN Begin W2:=W1; W1:= NIL End Inserisci (W1) Procedura Inserisci (W:Pun) Var W3: Pun; New (W3); W3.Inf:= X; W3 .Conta:= 1; W3.Next:=W W2.Next:=W3 End ; Begin %programma principale% New(Radice); Radice .Next=NIL; Read(K); While K <> “Fine” DO Begin Ricerca(Radice, K) Read(K) End; End.

53 Osservazione Le operazioni di inserimento di un nuovo elemento in una Lista possono essere variate in modo da passare come parametro l’elemento già creato tramite una procedura Crea Elemento Procedura CreaElem (Var P: Pun, X: Info) Begin new(P); P.Inf:=X; P.Next:=NIL End;

54 Operazioni definite su Lista
Creazione di un nuovo elemento CreaEl(R,X) Inserimento di un elemento in testa InsTesta(R,E) Inserimento di un elemento in coda InsCoda(R,E) Inserimento di un elemento dopo P Inserisci(P,E) Eliminazione dell’elemento in testa ElimTesta(R) Eliminazione di un elemento in coda ElimCoda(R) Eliminazione di un elemento dopo P Elimina(P) Scansione della lista Scansione(R) Creazione di una lista di N elementi CreaT(R,N) Creazione di una lista di N elementi CreaC(R,N)

55 Ordinamento di una Lista
Esercizio Data una lista di N elementi ordinare gli elementi, in ordine decrescente del campo informazione supposto essere di tipo Integer

56 Introduzione agli Algoritmi
Esercizi su Liste Dr. Emanuela Merelli

57 Lista Lineare è un insieme ordinato di n elementi, tutti dello stesso tipo, ogni elemento ha un predecessore e un successore Proprietà: X1 è il primo elemento della lista Xi è preceduto da xi-1 e seguito da xi+1 Xn è l’ultimo elemento della lista N= lunghezza della lista N=0  Lista Vuota A B C E D L(A, B, C, D) Relazione di precedenza: per accedere ad un elemento si deve accedere a tutti quelli che lo precedono

58 Lista Lineare come Tipo di Dato Astratto
Dominio dei valori Insieme dinamico basato su un elemento omogeneo Operazioni su Lista Lineare Inserire un elemento in testa Inserire un elemento in coda Inserire un elemento dopo un elemento puntato da P Creare una lista con N elementi ….

59 Operazioni su Liste Lineari
Inserimento di un elemento in Testa alla Lista Struttura Dati Sequenza ordinata di elementi di tipo record formati da due campi, un campo informazione e un campo puntatore ad elemento. Struttura dati dinamica Utilizzo del tipo puntatore Lista d’input Inizio B C D E Nuovo elemento A Lista d’output A B C E D Inizio

60 Inserimento di un elemento in testa
Algoritmo Creare il nuovo elemento Memorizzare l’informazione nel nuovo elemento Collegare il nuovo elemento in testa alla lista esistente Il campo puntatore del nuovo elemento assume il valore di inizio lista Inizio lista assume il valore del nuovo elemento Lista d’input Inizio B C D E Nuovo elemento A Lista d’output A B C E D Inizio

61 Inserimento di un elemento in testa
Type T = RECORD Inf : Integer; Next : TP; END; Pun =  T; Var Primo: Pun; A: T; Procedura Testa (Var Inizio: Pun, X: Integer) Var Q: Pun; Begin New(Q); Q.Inf := X; Q.Next := Inizio; Inizio:= Q; Lista d’input Inizio B C D E Nuovo elemento A Lista d’output Inizio A B C E D

62 Homework Definire una Funzione Testa di tipo puntatore che prenda in input un valore X e restituisca Testa con X come primo elemento

63 Eliminazione dell’elemento in testa ad una lista
Type T = RECORD Inf : Integer; Next : TP; END; Pun =  T; Var Primo: Pun; A: T; Procedura Testa (Var Inizio: Pun, X: Integer) Var Q: Pun; Begin New(Q); Q.Inf := X; Q.Next := Inizio; Inizio:= Q; Lista d’input Inizio A B C E D Elemento eliminato A Lista d’output B C E D Inizio

64 Scansione di una lista lineare
Procedura Scansione (Var Inizio: Pun) Begin WHILE Inizio <> NIL DO Writeln(Inizio.Inf); Inizio:= Inizio.Next; End; 3 345 9 5 23

65 Inserimento di un elemento in coda
Procedura Coda (Var Inizio: Pun, X: Integer) Var P, Q: Pun; Begin New(Q); Q.Next := NIL; Q.Inf := X; P:= Inizio; IF Inizio=NIL THEN Inizio:=Q ELSE Begin WHILE P.Next <> NIL DO P:=P.Next; P.Next:=Q; END; Lista d’input Inizio A B C D Nuovo elemento E Lista d’output A B C E D

66 Inserimento di un elemento dopo un elemento puntato da P
Procedura Inserisci (Var P: Pun, X: Integer) Var Q: Pun; Begin New(Q); Q.Inf := X; Q.Pun:= P.Next; Q.Next:=P; END; Lista d’input P A B D E Nuovo elemento C Lista d’output A B C E D

67 Creazione di una lista di N elementi
Procedura Crea (Var Inizio: Pun, N: Integer) Var P, Q: Pun; Begin Inizio:= NIL; WHILE N>0 DO New(Q); Q.Next := Inizio; Inizio:= Q; Q.Inf:=N; N:= N-1 END; 3 345 9 5 23

68 Esercizio 1 Data un elenco di parole, si vuole costruire una Lista Ordinata contenente un elemento per ogni distinta parola. Il generico elemento della Lista conterrà un campo informazione (la parola) e un contatore che indicherà il numero di occorrenze della parola nell’elenco.

69 Inserimento in Liste Ordinate
Type stringa = … Pun = Parola; Parola = RECORD Inf : Stringa; Conta: Integer Next : Pun; END; Var K: Stringa; Radice:Pun; Procedura Ricerca (Var Inizio: Pun, X: stringa) Var W1,W2 : Pun; Begin W2:= Inizio; W1:=W2 .Next; IF W1 = NIL THEN Inserisci (NIL) ELSE WHILE (W1.Inf < X AND (W1.Next <> NIL) DO Begin W2:=W1; W1:=W1 .Next End; IF W1.Inf = X THEN W1 . Conta:= W1 .Conta+1 ELSE Begin IF W1.Next:= NIL THEN Begin W2:=W1; W1:= NIL End Inserisci (W1) Procedura Inserisci (W:Pun) Var W3: Pun; New (W3); W3.Inf:= X; W3 .Conta:= 1; W3.Next:=W W2.Next:=W3 End ; Begin %programma principale% New(Radice); Radice .Next=NIL; Read(K); While K <> “Fine” DO Begin Ricerca(Radice, K) Read(K) End; End.

70 Introduzione agli Algoritmi e alle Strutture Dati
Liste e allocazione dinamica -- esercizio Dr. Emanuela Merelli

71 Esercizio 1 Dato un elenco di parole (testo), si vuole costruire una Lista Ordinata contenente un elemento per ogni distinta parola. Il generico elemento della Lista conterrà un campo informazione (la parola) e un contatore che indicherà il numero di occorrenze della parola nell’elenco.

72 Esempio L’Algoritmo proposto è la generalizzazione
Elenco E B D A B, 3 C,1 E,8 D,5 Inizio L’Algoritmo proposto è la generalizzazione dell’ Inserimento di un elemento in una lista ordinata

73 Ordinamento di una lista
L’ordinamento della lista viene ottenuto inserendo nuovi elementi al posto appropriato, piuttosto che in testa alla lista Ciò deriva dalla flessibilità con cui gli elementi possono essere inseriti in qualunque posto. Questa caratteristica non è presente nella struttura array. Notiamo che l’equivalente ricerca binaria per array non è disponibile per le liste in generale

74 Inserimento in una lista Ordinata ognuno contenente come informazione una parola e un intero n
Algoritmo Caso 1: Lista vuota Passo 1. l’elemento è inserito in testa Caso 2: Lista non vuota Passo 1. Si cerca l’elemento Caso 2.1: L’elemento esiste nella lista Passo 1. Si incrementa il contatore Caso 2.2: L’elemento non esiste Caso Se il nuovo è il più piccolo Passo1. L’elemento è inserito in testa Caso Se è compreso tra due valori Passo 1. L’elemento è inserito prima dell’elemento con chiave più grande Caso Se è il più grande Passo 1. L’elemento è inserito in coda

75 Inserimento prima di P 1a soluzione
New(Q); Q..Next=P.Next, Q.Inf:=P .Inf; P .Inf:=X; P .Next:=Q …. C Q B C E D Q B D E P

76 Inserimento prima di P 2a soluzione
Procedure Inserisci(P: Pun) Var Q:Pun; Begin New(Q); Q.Inf:=X; Q.Next=P, W2.Next:=Q; End; D Q B C E D Q W2 P B C E W2 P

77 Programma Principale Pila o Stack Memoria Dinamica Memoria Statica
Program Esercizio1; Type stringa = … Pun = Parola; Parola = RECORD Inf : Stringa; Conta: Integer Next : Pun; END; Var K: Stringa; Radice:Pun; Pila o Stack nil Memoria Dinamica ... Begin %programma principale% New(Radice); Radice.Next=NIL; Read(K); While K <> “Fine” DO Begin Ricerca(Radice, K) Read(K) End; End. Radice K Memoria Statica

78 Caso 1: Lista Vuota Procedure Inserisci(P: Pun) Var Q:Pun; Begin
New(Q); Q.Inf:=X; Q.Next=P, W2.Next:=Q; End; Caso 1: Lista Vuota Var K: Stringa; Radice:Pun; Procedure Ricerca ( var Inizioe:Pun, X:Stringa) Var P1,W2 : Pun; Begin W2:= Inizio; W1:=W2 .Next; If W1 = NIL Then Inserisci (NIL) Else While (W1.Inf < X And (W1.Next <> NIL) Do W2:=W1; W1:=W1 .Next End; If W1.Inf = X Then W1. Conta:= W1.Conta+1 Else Begin If W1.Next:= NIL Then Begin W2:=W1; W1:=NIL; End Inserisci(W1); End; End ... Begin %programma principale% New(Radice); Radice.Next=NIL; Read(K); While K <> “Fine” DO Begin Ricerca(Radice, K) Read(K); End; End. Q E nil P Inserisci Inizio=Radice Pila o Stack X W1 Ricerca W2 nil Memoria Dinamica Radice K Memoria Statica

79 Caso 2: Lista Non Vuota Inserimento in testa
Procedure Inserisci(P: Pun) Var Q:Pun; Begin New(Q); Q.Inf:=X; Q.Next=P, W2.Next:=Q; End; Caso 2: Lista Non Vuota Var K: Stringa; Radice:Pun; Procedure Ricerca ( var Inizio:Pun, X:Stringa) Var P1,W2 : Pun; Begin W2:= Inizio; W1:=W2 .Next; If W1 = NIL Then Inserisci (NIL) Else While (W1.Inf < X And (W1.Next <> NIL) Do W2:=W1; W1:=W1 .Next End; If W1.Inf = X Then W1. Conta:= W1.Conta+1 Else Begin If W1.Next:= NIL Then Begin W2:=W1; W1:=NIL; End Inserisci(W1); End; End ... Begin %programma principale% New(Radice); Radice.Next=NIL; Read(K); While K <> “Fine” DO Begin Ricerca(Radice, K) Read(K); End; End. Inserimento in testa Memoria Statica Dinamica Pila o Stack Radice K E nil B Memoria Statica Dinamica Pila o Stack Radice K nil E Inserisci Q P W2 W1 X Inizio=Radice Ricerca B

80 Caso 3: Lista Non Vuota Inserimento in testa
Procedure Inserisci(P: Pun) Var Q:Pun; Begin New(Q); Q.Inf:=X; Q.Next=P, W2.Next:=Q; End; Caso 3: Lista Non Vuota Var K: Stringa; Radice:Pun; Procedure Ricerca ( var Inizio:Pun, X:Stringa) Var P1,W2 : Pun; Begin W2:= Inizio; W1:=W2 .Next; If W1 = NIL Then Inserisci (NIL) Else While (W1.Inf < X And (W1.Next <> NIL) Do W2:=W1; W1:=W1 .Next End; If W1.Inf = X Then W1. Conta:= W1.Conta+1 Else Begin If W1.Next:= NIL Then Begin W2:=W1; W1:=NIL; End Inserisci(W1); End; End ... Begin %programma principale% New(Radice); Radice.Next=NIL; Read(K); While K <> “Fine” DO Begin Ricerca(Radice, K) Read(K); End; End. Inserimento in testa Memoria Statica Dinamica Pila o Stack Radice K E nil B D W2 W1 X Inizio=Radice Ricerca Inserisci Q P Memoria Statica Dinamica Pila o Stack Radice K E nil B D W2 W1 X Inizio=Radice Ricerca Memoria Statica Dinamica Pila o Stack Radice K E nil B D Memoria Statica Dinamica Pila o Stack Radice K E nil B D W2 W1 X Inizio=Radice Ricerca Inserisci Q P Memoria Statica Dinamica Pila o Stack Radice K E nil B W2 W1 X Inizio=Radice Ricerca

81 Ordinamento di una Lista
Esercizio Data una lista di N elementi ordinare gli elementi, in ordine decrescente del campo informazione supposto essere di tipo Integer Complessità?


Scaricare ppt "Algoritmi e Strutture Dati"

Presentazioni simili


Annunci Google