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?