LABORATORIO DI ALGORITMI E STRUTTURE DATI A-L

LABORATORIO DI ALGORITMI
E STRUTTURE DATI A-L
Ingegneria e scienze informatiche – Cesena
A.A: 2016/2017
Docente: Greta Sasso
Strutture dati astratte
 Liste con priorità
 Pile
 Code
 Alberi
 Grafi
 ….
Liste con priorità
 Gli elementi vengono mantenuti ordinati secondo un certo
criterio che ne indica la priorità rispetto agli altri.
 Sono gestite come semplici liste.
struct NODO {
int elem;
struct NODO* next;
};
struct NODO * list = NULL;
Inserimento in lista ordinata
Inserimento in lista ordinata
struct NODO* nuovo = (struct NODO*)malloc(sizeof( struct NODO));
if (nuovo == NULL) return NULL;
nuovo->next = NULL;
nuovo->elem = e;
if (lista == NULL || lista->elem > nuovo->elem) {
//inserimento in testa
nuovo->next = lista;
lista = nuovo;
}
else {
prec = NULL;
temp = lista;
while (temp != NULL) {
if (temp->elem > nuovo->elem) {
//cella con valore più grande, inserisco
prec>next=nuovo;
nuovo->next = temp;
return lista;
}
prec = temp;
temp = temp->next;
}
if (temp == NULL) //inseriamo in coda
prec->next = nuovo;
} return lista;
Pile e code
 Operazioni:
 Pop : ritorna un elemento della lista e comporta la sua cancellazione
 Push: comporta l’inserimento nella lista di un nuovo elemento
 Pile:
 Pop  in testa
 Push  in testa
 Esempi : parola palindroma, parentesi bilanciate, …
 Code:
 Pop  in testa
 Push  in coda
 Esempi : notazione infissa / postfissa, …
Prima di iniziare
 Un piccolo suggerimento per risparmiare tempo durante le
esercitazioni:
Implementatevi una vostra libreria di funzioni utili da riutilizzare o da
modificare. Possiamo iniziare con le funzioni di base delle liste generiche:
 Inserimento
 Cancellazione
 Stampa
struct NODE {
//mylib.h
int elem;
struct NODE* next;
}
//dichiarazione delle funzioni
struct NODE* insert(NODE* list ,int e);
struct NODE* canc (NODE* list ,int e);
void print(NODE* list);
//mylib.c
//definizione delle funzioni
struct NODE* insert (struct
//corpo della funzione
}
NODE* list,int e){
struct NODE* canc (struct NODE* list ,int e){
//corpo della funzione
}
void print(struct NODE* list){
//corpo della funzione
}
//Utilizzo delle funzioni
#include "mylib.h"
void main(){
struct NODE* lista=NULL;
lista= insert(lista, 5);
print(lista);
}
Esempio
jjjj
 Scrivere una procedura non ricorsiva con tempo O(n)
che inverte una lista concatenata di n elementi.
 Fare la stessa cosa con l’approccio ricorsivo
[ Esame 3.1 ]
jjjj
 Si implementi un algoritmo di complessità ottima per
l’unione di due insiemi disgiunti O(n+m). I due insiemi
sono rappresentati tramite liste concatenate con
ordinamento crescente . Si consideri n la dimensione
della prima lista, e m la dimensione della seconda lista.
 Come varia l’algoritmo se i due insiemi non sono ordinati?
[ Esercizi Proposti 3.2 ]
jjjj
Determinare se una stringa in input contiene parentesi
bilanciate e correttamente innestate. Ad esempio (()()) è una
stringa corretta. Si dia per scontato che nella stringa siano
presenti solo parentesi tonde aperte e chiuse.
 Parametro in input: char* stringa
Implementare un algoritmo che restituisca 1 in caso positivo (
stringa bilanciata correttamente) , 0 altrimenti.
 Suggerimento : utilizzare le pile
o step 2° : come cambia l’algoritmo se si includono le parentesi
quadre e le parentesi graffe?
[ Esercizi Proposti – 3.3 ]
o Si implementi un algoritmo che , data una coda L di interi,
genera un’altra coda L’ in modo che tutti gli elementi dispari
precedano nello stesso ordine che avevano inizialmente in L,
tutti gli elementi pari
o Esempio: L= 3,7,8,1,4  L’=3,7,1,8,4
[ Esame – 3.4 ]
Domande e discussione
 Domande?