Liste
Indice
Definizione
Le liste collegate (dette anche linked list) sono una struttura dati astratta (ADT) molto usata in situazioni/contesti molto diversi Ci possono essere utili infatti ogni volta in cui dobbiamo memorizzare una sequenza di valori la cui lunghezza non ci è nota a priori e che può variare nel tempo.
E' inoltre utile in tutti i casi in cui dobbiamo poter inserire nuovi elementi all’inizio della sequenza, in una posizione intermedia, oppure in fondo.
Sintassi struttura dati base
struct list_element { element_type value; struct list_element *next; };
In base al valore che ho necessita' di salvare andro' a creare una struttura dati diversa. Esempio:
struct list_element { int value; struct list_element *next; };
Per scrivere meno o abbreviare il nome del tipo e' possibile usare la parola chiave typedef
typedef struct list_element { int value; struct list_element *next; } item;
Da qui in poi usero' il tipo item per scrivere codice piu' compatto, ma questo non e' in nessun modo obbligatorio.
Inserimento in testa
La lista delle operazioni da fare e':
- leggere valore
- allocare memoria (e controllare che sia valida)
- copiare valore nel campo corretto dell'elemento lista
- collegare il nuovo elemento alla testa della lista
- aggiornare il puntatore alla lista
item *tmp; item *head = NULL; int valore_da_inserire; scanf("%d", &valore_da_inserire); // 1 tmp = (item *)malloc(sizeof(item)); // 2 if (tmp == NULL) { printf("MESSAGGIO DI ERRORE"); exit(-42); } tmp->value = valore_da_inserire; // 3 tmp->next = testa; // 4 testa = tmp; // 5
Stampa di una lista
E' necessario usare un ciclo while
void stampa_lista(item *testa) { while(testa != NULL) { printf("valore: %d\n", testa->value); testa = testa->next; } }
Inserimento in coda
- creo l'elemento
- se la lista e' vuota aggiorno la testa della lista
- altrimenti devo cercare l'ultimo elemento della lista
- collego l'ultimo elemento al nuovo elemento creato
In tutti i casi restituisco la testa della lista in modo da gestire il caso di inserimento in lista vuota
struct list_element *inserisci_in_coda(struct list_element *testa, int valore) { struct list_element *tmp; struct list_element *lista; lista = testa; //creo l'elemento da inserire tmp = (struct list_element *)malloc(sizeof(struct list_element)); if (tmp == NULL) { printf("FALLITA MALLOC\n"); exit(-1); } tmp->value = valore; tmp->next = NULL; if (testa == NULL) { testa = tmp; } else { //1 cerchiamo ultimo elemento (GESTIAMO CASO LISTA NON VUOTA) while(lista->next != NULL) { lista = lista->next; } // se arrivo qui ho testa punta all'ultimo elemento lista->next = tmp; // collego ultimo elemento al nuovo } return testa; }