Liste concatenate
Transcript
Liste concatenate
Liste concatenate Liste concatenate in C Liste concatenate Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2016/2017 Liste concatenate Liste concatenate in C Calendario delle lezioni Lez. 1 - Introduzione all’ambiente Linux Lez. 2 - Introduzione al C Lez. 3 - Tipi primitivi e costrutti condizionali Lez. 4 - Costrutti iterativi ed array Lez. 5 - Funzioni, stack e visibilita’ variabili Lez. 6 - Puntatori e memoria Lez. 7 - Tipi di dati utente Lez. 8 - Liste concatenate e librerie Liste concatenate Liste concatenate in C Sommario 1 Liste concatenate 2 Liste concatenate in C Liste concatenate Liste concatenate in C Outline 1 Liste concatenate 2 Liste concatenate in C Liste concatenate Liste concatenate in C Liste Concatenate Fin’ora abbiamo visto come gli array ci permettano di rappresentare sequenze di elementi dello stesso tipo. Esempi: array di interi, array di caratteri, ma anche array di struct. Liste concatenate Liste concatenate in C Liste Concatenate Fin’ora abbiamo visto come gli array ci permettano di rappresentare sequenze di elementi dello stesso tipo. Esempi: array di interi, array di caratteri, ma anche array di struct. Hanno dei vantaggi (accesso diretto, ossia tramite indice, e allocazione contigua in memoria) ma anche degli svantaggi: Liste concatenate Liste concatenate in C Liste Concatenate Fin’ora abbiamo visto come gli array ci permettano di rappresentare sequenze di elementi dello stesso tipo. Esempi: array di interi, array di caratteri, ma anche array di struct. Hanno dei vantaggi (accesso diretto, ossia tramite indice, e allocazione contigua in memoria) ma anche degli svantaggi: hanno una dimensione fissata (a meno di non riallocare lo spazio dinamicamente); Liste concatenate Liste concatenate in C Liste Concatenate Fin’ora abbiamo visto come gli array ci permettano di rappresentare sequenze di elementi dello stesso tipo. Esempi: array di interi, array di caratteri, ma anche array di struct. Hanno dei vantaggi (accesso diretto, ossia tramite indice, e allocazione contigua in memoria) ma anche degli svantaggi: hanno una dimensione fissata (a meno di non riallocare lo spazio dinamicamente); inserire/eliminare un elemento all’interno di un array puo’ essere un’operazione costosa: Liste concatenate Liste concatenate in C Liste Concatenate Fin’ora abbiamo visto come gli array ci permettano di rappresentare sequenze di elementi dello stesso tipo. Esempi: array di interi, array di caratteri, ma anche array di struct. Hanno dei vantaggi (accesso diretto, ossia tramite indice, e allocazione contigua in memoria) ma anche degli svantaggi: hanno una dimensione fissata (a meno di non riallocare lo spazio dinamicamente); inserire/eliminare un elemento all’interno di un array puo’ essere un’operazione costosa: Liste concatenate Liste concatenate in C Liste Concatenate Fin’ora abbiamo visto come gli array ci permettano di rappresentare sequenze di elementi dello stesso tipo. Esempi: array di interi, array di caratteri, ma anche array di struct. Hanno dei vantaggi (accesso diretto, ossia tramite indice, e allocazione contigua in memoria) ma anche degli svantaggi: hanno una dimensione fissata (a meno di non riallocare lo spazio dinamicamente); inserire/eliminare un elemento all’interno di un array puo’ essere un’operazione costosa: Liste concatenate Liste concatenate in C Liste Concatenate Fin’ora abbiamo visto come gli array ci permettano di rappresentare sequenze di elementi dello stesso tipo. Esempi: array di interi, array di caratteri, ma anche array di struct. Hanno dei vantaggi (accesso diretto, ossia tramite indice, e allocazione contigua in memoria) ma anche degli svantaggi: hanno una dimensione fissata (a meno di non riallocare lo spazio dinamicamente); inserire/eliminare un elemento all’interno di un array puo’ essere un’operazione costosa: Liste concatenate Liste concatenate in C Liste Concatenate Una lista concatenata (linked list) e’ una sequenza di nodi, ciascuno dei quali memorizza un dato e contiene un riferimento (puntatore) al nodo successivo. Sono strutture dinamiche: possiamo gestirle facilmente in maniera tale che crescano/decrescano in accordo alla quantita’ di dati che vogliamo memorizzare; in particolare per aggiungere o cancellare nodi in una qualunque posizione basta aggiustare i riferimenti all’interno della lista, senza toccare gli elementi non coinvolti. Liste concatenate Liste concatenate in C Inserzione/Cancellazione Inserzione: Liste concatenate Liste concatenate in C Inserzione/Cancellazione Inserzione: Liste concatenate Liste concatenate in C Inserzione/Cancellazione Inserzione: Rimozione: Liste concatenate Liste concatenate in C Array vs. Liste Anche le liste hanno i propri vantaggi e svantaggi: + inserzione e rimozione molto piu’ semplice che negli array (non c’e’ bisogno di riorganizzare tutta la struttura); + sono strutture dinamiche, possiamo crescere e decrescere facilmente durante l’esecuzione del programma. Liste concatenate Liste concatenate in C Array vs. Liste Anche le liste hanno i propri vantaggi e svantaggi: + inserzione e rimozione molto piu’ semplice che negli array (non c’e’ bisogno di riorganizzare tutta la struttura); + sono strutture dinamiche, possiamo crescere e decrescere facilmente durante l’esecuzione del programma. - sono una sequenza di dati, quindi per arrivare ad un particolare nodo (es. l’ultimo) e’ necessario percorrere tutta la lista; - non sono memorizzate in maniera contigua in memoria (piu’ tempo per passare da un elemento all’altro) Liste concatenate Liste concatenate in C Array vs. Liste Anche le liste hanno i propri vantaggi e svantaggi: + inserzione e rimozione molto piu’ semplice che negli array (non c’e’ bisogno di riorganizzare tutta la struttura); + sono strutture dinamiche, possiamo crescere e decrescere facilmente durante l’esecuzione del programma. - sono una sequenza di dati, quindi per arrivare ad un particolare nodo (es. l’ultimo) e’ necessario percorrere tutta la lista; - non sono memorizzate in maniera contigua in memoria (piu’ tempo per passare da un elemento all’altro) Da questo punto di vista array e liste si complementano Liste concatenate Liste concatenate in C Outline 1 Liste concatenate 2 Liste concatenate in C Liste concatenate Liste concatenate in C Rappresentazione in C In C le liste vengono realizzate mediante struct. Andiamo a definire il generico nodo: typedef s t r u c t ll_node_struct { / / dato int info ; / / p u n t a t o r e a l prossimo elemento s t r u c t l l _ n o d e _ s t r u c t ∗ next ; } ll_node ; l’ultimo elemento della lista non ha successore e quindi il suo campo next sara’ uguale a NULL; Liste concatenate Liste concatenate in C Rappresentazione in C In C le liste vengono realizzate mediante struct. Andiamo a definire il generico nodo: typedef s t r u c t ll_node_struct { / / dato int info ; / / p u n t a t o r e a l prossimo elemento s t r u c t l l _ n o d e _ s t r u c t ∗ next ; } ll_node ; l’ultimo elemento della lista non ha successore e quindi il suo campo next sara’ uguale a NULL; l’inizio della lista e’ individuato da una variabile head (tipo ll_node ) che punta al primo elemento. L’accesso alla lista avviene attraverso il puntatore al primo elemento. Liste concatenate Liste concatenate in C Liste concatenate - codice Esempio: creazione di una lista con tre elementi {5, 1, 20}: Liste concatenate Liste concatenate in C Liste concatenate - codice Esempio: creazione di una lista con tre elementi {5, 1, 20}: Liste concatenate Liste concatenate in C Liste concatenate - codice Esempio: creazione di una lista con tre elementi {5, 1, 20}: Liste concatenate Liste concatenate in C Inserimento in coda Per inserire un nuovo elemento in coda, dobbiamo percorrere tutta la lista fino ad arrivare all’ultimo elemento. l l _ n o d e ∗ i n s e r t ( l l _ n o d e ∗ head , i n t v ) { l l _ n o d e ∗ c u r r =head ; l l _ n o d e ∗new_node= m a l l o c ( s i z e o f ( l l _ n o d e ) ) ; new_node−> i n f o =v ; new_node−>n e x t =NULL ; i f ( head==NULL ) / / l i s t a vuota r e t u r n new_node ; w h i l e ( c u r r −>n e x t ! =NULL ) / / scorriamo l a l i s t a c u r r = c u r r −>n e x t ; c u r r −>n e x t =new_node ; r e t u r n head ; } Bisogna gestire con attenzione il caso di lista vuota! Liste concatenate Liste concatenate in C Liste concatenate - eliminazione nodo Quali sono le operazioni necessarie per eliminare il successore di un elemento p? Liste concatenate Liste concatenate in C Liste concatenate - eliminazione nodo Quali sono le operazioni necessarie per eliminare il successore di un elemento p? Trovare l’indirizzo s del suo successore; Trovare l’indirizzo s0 del successore di s; Assegnare s0 al valore del successore di p. Liberare la memoria puntata da s. Liste concatenate Liste concatenate in C Liste concatenate - eliminazione nodo typedef s t r u c t ll_node_struct { int info ; s t r u c t l l _ n o d e _ s t r u c t ∗ next ; } ll_node ; i n t d e l e t e _ s u c c e s s o r ( l l _ n o d e ∗ node ) { ll_node ∗ next_next ; i f ( node==NULL | | node−>n e x t == NULL ) r e t u r n ; n e x t _ n e x t = ( node−>n e x t )−>n e x t ; f r e e ( node−>n e x t ) ; node−>n e x t = n e x t _ n e x t ; } Liste concatenate Liste concatenate in C Regole e consigli fate attenzione a non perdere/sovrascrivere head altrimenti non avrete accesso a tutta la lista; liberate sempre la memoria; gestite con attenzione i casi limite, tipo lista vuota (alle volte meglio ragionare prima su un pezzo di carta!)