1. PROGETTO DI ALGORITMI E STRUTTURE DATI
LISTE
IGNAZIO ALTOMARE
FABIO GADALETA
SERGIO CENTRONE
Altomare Ignazio, Centrone Sergio, Gadaleta Fabio Pag.1 di 12
2. ANALISI
Liste:
• Confronto sovrapposizione(Lista<Tipoelem> I1, Lista<Tipoelem> I2), dove class
Confronto {private: Lista<Tipoelem> C; int lunghezzaC; Lista<Tipoelem>R1; int
lunghezzaR1; Lista<Tipoelem>R2; int lunghezzaR2}: C contiene gli elementi iniziali in
comune fra I1 e I2, R1 contiene il resto degli elementi di I1 ed R2 contiene il resto degli
elementi di I2.
• <Tipoelem> intersezione(Lista<Tipoelem> I1, Lista<Tipoelem> I2), che restituisce
l'ultimo elemento in comune fra I1 e I2.
Esempio:
sovrapposizione((a b c d e f g), (a b c e l)) = {C: (a b c); lunghezzaC: 3; R1: (d e f g); lunghezzaR1:
4; R2: (e); lunghezzaR2: 2}
intersezione((a b c d e f g), (a b c e l)) = e
Dall'analisi della traccia emerge che si devono realizzare due funzioni che operino su due liste
distinte.
La prima effettuerà un'operazione di sovrapposizione sulle due liste che saranno fornite.
Lo scopo di questa sovrapposizione sarà quello di ottenere tre liste differenti nelle quali saranno
presenti :
LISTA C: conterrà gli elementi iniziali in comune tra le 2 liste che verranno date in input
alla funzione sovrapposizione
LISTA R1: conterrà gli elementi non inseriti nella lista C facenti parte della prima lista
fornita in input alla funzione
LISTA R2: conterrà gli elementi non inseriti nella lista C facenti parte della seconda lista
Altomare Ignazio, Centrone Sergio, Gadaleta Fabio Pag.2 di 12
3. fornita in input alla funzione
Viene in oltre richiesto il calcolo della lunghezza di ciascuna delle liste definite in precedenza.
La seconda funzione avrà il compito di computare l'intersezione delle due liste date in input alla
funzione.
La funzione restituirà l'ultimo elemento computato.
Dall'analisi della traccia non risultano riferimenti relativi ai seguenti problemi:
1. Dimensioni massime delle liste date come input alle funzioni.
2. Tipo di elemento che sarà contenuto nelle liste.
3. Non è definito se le liste inserite saranno ordinate oppure no.
4. Non vi è accenno alla possibilità che una delle liste, o entrambe, possano essere vuote.
5. Comportamento della funzione in caso di mancanza di elementi di intersezione tra le due liste date
in input.
6. Comportamento della funzione in caso di presenza degli ultimi elementi di intersezione nelle stesse
posizioni all'interno delle due liste.
7. Non viene definito se all interno delle liste possano essere presenti elementi duplicati.
8. Non viene definito se le due liste debbano essere di stessa dimensione oppure di dimensione
distinta.
Ai problemi risultati sono state prese le seguenti decisioni:
1. La dimensione massima delle liste verrà chiesta all utente al momento della creazione delle stesse.
2. Visto che le funzioni implementate sono eseguibili su vari tipi di dati, le funzioni saranno
implementate in maniera generica.
3. Viene considerato che le liste non siano ordinate.
4. Quando viene chiesta la dimensione massima della lista vi sarà un opportuno controllo affinché
entrambe le liste contengano almeno un elemento.
Altomare Ignazio, Centrone Sergio, Gadaleta Fabio Pag.3 di 12
4. 5. La funzione di intersezione può essere applicata solo nel caso in cui tra le due liste sono presenti
degli elementi di intersezione.
6. Prendiamo l elemento ultimo assoluto di entrambe le liste.
7. Nel caso in cui vi siano duplicati saranno considerati come normali elementi della lista.
8. Le due liste potranno avere sia una dimensione identica oppure dimensione diversa.
Altomare Ignazio, Centrone Sergio, Gadaleta Fabio Pag.4 di 12
5. DEFINIZIONE DEI DATI
La struttura dati utilizzata per la risoluzione del problema è la seguente:
LISTA
Specifica sintattica:
TIPI:
Lista
Posizione
Boolean
Tipoelem
OPERATORI:
CREALISTA : ( ) Lista
LISTAVUOTA: ( Lista) Boolean
LEGGILISTA : (Posizione, Lista) Tipoelem
SCRIVILISTA : (Tipoelem, Posizione ,Lista) Lista
PRIMOLISTA : (Lista) Posizione
FINELISTA : (Posizione, Lista) Boolean
SUCCLISTA : (Posizione, Lista) Posizione
PREDLISTA : (Posizione, Lista) Posizione
INSLISTA : (Tipoelem, Posizione, Lista) Lista
CANCLISTA : (Posizione, Lista) Lista
Altomare Ignazio, Centrone Sergio, Gadaleta Fabio Pag.5 di 12
6. Specifica semantica:
TIPI:
Lista: insieme delle sequenze L = < a1, a2, & , an >, n ≥ 0, di elementi di tipo Tipoelem, dove
l'elemento i-esimo ha valore ai e posizione pos(i)
Boolean: insieme dei valori di verità
OPERATORI:
CREALISTA = L'
POST: L' = L, L = < > (sequenza vuota)
LISTAVUOTA(L) = b
POST: b = true se L= < >, b = false altrimenti
LEGGILISTA(p,L) = a
PRE: L = < a1, a2, & , an >, p = pos(i), 1 ≤ i ≤ n
POST: a = ai
SCRIVILISTA(a,p,L) = L'
PRE: L = < a1, a2, & , an >, p = pos(i), 1 ≤ i ≤ n
POST: L' = < a1, a2, & , ai-1, a, ai+1, & , an >
PRIMOLISTA(L) = p
POST: p = pos(1)
FINELISTA(p,L) = b
PRE: L = < a1, a2, & , an >, p = pos(i), 1 ≤ i ≤ n + 1
POST: b = true se p = pos(n+1), b= false altrimenti
SUCCLISTA(p,L) = q
PRE: L = < a1, a2, & , an >, p = pos(i), 1 ≤ i ≤ n
POST: q = pos(i+1)
PREDLISTA(p,L) = q
PRE: L = < a1, a2, & , an >, p = pos(i), 1 ≤ i ≤ n
Altomare Ignazio, Centrone Sergio, Gadaleta Fabio Pag.6 di 12
7. POST: q = pos(i-1)
INSLISTA(a,p,L) = L'
PRE: L = < a1, a2, & , an >, p = pos(i), 1 ≤ i ≤ n + 1
POST: L' = < a1, a2, & , ai-1, a, ai, ai+1, & , an >, se 1 ≤ i ≤ n
L' = < a1, a2, & , an, a > , se i = n+1 (e quindi L' = < a > se i = 1 e L = < >)
CANCLISTA(p,L) = L'
PRE: L = < a1, a2, & , an >, p = pos(i), 1 ≤ i ≤ n
POST: L' = < a1, a2, & , ai-1, ai+1, & , an >
Realizziamo, oltre alla specifica sintattica e semantica della lista, anche quella delle funzione che
andranno realizzate:
CONFRONTO
Specifica sintattica:
TIPI:
ListaC
ListaR1
ListaR2
Boolean
Tipoelem
Intero
LunghezzaC
LunghezzaR1
LunghezzaR2
Altomare Ignazio, Centrone Sergio, Gadaleta Fabio Pag.7 di 12
8. OPERATORI:
incC : (Confronto) (confronto)
incR1 : (Confronto) (confronto)
incR2: (Confronto) (confronto)
prendiC(Confronto) (Lista);
prendiR1(Confronto) (Lista);
prendiR2(Confronto) (Lista);
lunghC(Confronto) (Intero)
lunghR1(Confronto) (Intero);
lunghR2(Confronto) (Intero);
Specifiche semantiche:
TIPI:
Lista C: Lista i cui elementi sono di tipoelem che conterrà gli elementi presenti in entrambe
le liste fornite alla funzione.
Lista R1: Lista i cui elementi sono di tipoelem che conterrà gli elementi non presenti il C e
facenti parte della prima lista data alla funzione.
Lista R2: Lista i cui elementi sono di tipoelem che conterrà gli elementi non presenti il C e
facenti parte della seconda lista data alla funzione.
LunghezzaC: intero che rappresenta la dimensione della lista C
LunghezzaR1: intero che rappresenta la dimensione della lista R1
LunghezzaR2: intero che rappresenta la dimensione della lista R2
OPERATORI
inc C (temp) temp' : denota dinamicamente la dimensione della lista C
inc R1 (temp) temp' : denota dinamicamente la dimensione della lista R1
inc R2 (temp) temp' : denota dinamicamente la dimensione della lista R2
Altomare Ignazio, Centrone Sergio, Gadaleta Fabio Pag.8 di 12
9. prendiC(temp) L : rende possibile eseguire sulla lista C tutte le operazioni eseguibili su
una lista
prendiR1(temp) L : rende possibile eseguire sulla lista R1 tutte le operazioni eseguibili su
una lista
prendiR2(temp) L : rende possibile eseguire sulla lista R2 tutte le operazioni eseguibili su
una lista
lunghC(temp) Int : indica la lunghezza della lista C
lunghR1(temp) Int : indica la lunghezza della lista R1
lunghR2(temp) Int : indica la lunghezza della lista R2
ALGORITMO RISOLUTIVO DELLA
SOVRAPPOSIZIONE
confronto sovrapposizione (lista lista1, lista lista2)
confronto temp;
indice1 lista1.primolista();
indice2 lista2.primalista();
indiceC temp.prendiC().primolista();
indiceR1 temp.prendiR1().primolista();
indiceR2 temp.prendiR2().primolista();
Fintanto che (not lista1.finelista(indice1) AND not lista2.finelista(indice2) AND
(lista1.leggiLista(indice1) == (lista2.leggiLista(indice2))
temp.prendiC().insLista(lista1.leggiLista(indice1),indiceC);
indice1 lista1.succLista(indice1);
indice2 lista2.succLista(indice2);
indiceC temp.prendiC().succLista(indiceC);
Altomare Ignazio, Centrone Sergio, Gadaleta Fabio Pag.9 di 12
10. Fintanto che (not lista1.finelista(indice1))
temp.prendiR1().insLista(lista1.leggiLista(indice1),indiceR1);
indiceR1 temp.listaR1().succLista(indiceR1);
indice1 lista1.succLista(indice1);
Fintanto che (not lista2.finelista(indice2))
temp.prendiR2().insLista(lista2.leggiLista(indice2),indiceR2);
indiceR2 temp.listaR2().succLista(indiceR2);
indice2 lista2.succLista(indice2);
restituisci (temp);
ALGORITMO RISOLUTIVO PER IL CALCOLO
DELL INTERSEZIONE
Tipoelem intersezione (Lista lista1, Lista lista2);
indice1 lista1.primolista();
tipoelem temp1;
tipoelem temp2;
intero contatore 1;
intero numero1 0;
intero numero2 0;
Fintanto che (not lista1.fineLista(indice1))
posizione indice2 lista2.primoLista();
Fintanto che (not lista2.finelista(indice2)
Se (lista1.leggiLista(indice1) == (lista2.leggiLista(indice2)
Altomare Ignazio, Centrone Sergio, Gadaleta Fabio Pag.10 di 12
11. temp1 lista1.leggiLista(indice1);
numero1 contatore;
indice2 lista2.succLista(indice2);
indice1 lista1.succLista(indice1);
contatore contatore+1;
indice2 lista2.primolista();
contatore 1;
Fintanto che (not lista2.fineLista(indice2) AND (not numero1 == 0))
posizione indice1 lista1.primoLista();
Fintanto che (not lista1.finelista(indice1)
Se (lista1.leggiLista(indice1) == (lista2.leggiLista(indice2)
temp2 lista2.leggiLista(indice2);
numero2 contatore;
indice1 lista1.succLista(indice1);
indice2 lista2.succLista(indice2);
contatore contatore+1;
Se(numero1 == 0)
avvisa l' utente che non c è intersezione tra le due liste;
altrimenti
Se (numero1 >= numero2)
restituisci(temp1);
altrimenti
restituisci(temp2);
Altomare Ignazio, Centrone Sergio, Gadaleta Fabio Pag.11 di 12
12. REALIZZAZIONE
Le realizzazioni effettuate per l implementazione della funzione definita nella progettazione
saranno le seguenti:
• Realizzazioni con Vettore
• Realizzazione con Puntatori
Da notare che nella realizzazione con vettore la dimensione massima della lista consentita sarà di
1023 elementi.
TEST
Classi di equivalenza:
1. La dimensione di una delle due liste date in input, o di entrambe, è pari a 0.
2. Le due liste sono composte da elementi non omogenei.
3. Le due liste non sono della stessa dimensione.
4. Le due liste sono della stessa dimensione.
5. L intersezione delle due liste produce un valore.
6. La sovrapposizione delle due liste risulta nulla.
7. La sovrapposizione delle due liste produce risultati.
8. La sovrapposizione e l intersezione non producono entrambi risultati.
9. La sovrapposizione e l intersezione producono entrambi risultati.
Altomare Ignazio, Centrone Sergio, Gadaleta Fabio Pag.12 di 12