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?