Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoAnacleto Tosi Modificato 10 anni fa
1
1.Scrivere una funzione per cercare un numero x in una lista circolare di interi. La funzione deve restituire NULL se il numero non esiste. 2.Scrivere una funzione che cancella un nodo da una lista circolare contenente un valore x dato. 3.Scrivere una funzione per concatenare due liste circolari. La funzione dovrà restituire una puntatore allultimo nodo della nuova lista circolare. 4.Scrivere una funzione per fondere in unica lista circolare ordinata due liste circolari ordinate. 5.Scrivere una funzione per invertire una lista circolare NOTA: scrivere sempre pre e post condizione di ogni funzione Esercizi su liste circolari
2
Definizione di lista (elementi interi) struct list { int el; struct list *next; };
3
Esercizio 1 Scrivere una funzione per cercare un numero x in una lista circolare di interi. La funzione deve restituire NULL se il numero non esiste. Pre condizioni: la funzione prende in ingresso un numero x intero e una lista L circolare a valori interi Post condizioni: se x L, la funzione restituisce lelemento di L che codifica x altrimenti restituisce NULL
4
Svolgimento struct list *cerca(struct list *l, int x) { struct list *l2 = l; /* se la lista è vuota, restituisce NULL */ if (l == NULL) return NULL; /* per ogni elemento della lista */ do { if (l2->el == x) return l2; /* elemento successivo */ l2 = l2->next; } while(l2 != l); return NULL; }
5
Esercizio 2 Scrivere una funzione che cancella un nodo da una lista circolare contenente un valore x dato. Pre condizioni: la funzione prende in ingresso un numero x intero e una lista L circolare a valori interi Post condizioni: se x L, la funzione restituisce un puntatore valido alla lista L che codifica x altrimenti restituisce L
6
Svolgimento struct list *cancella(struct list *l, int x) { struct list *l2 = l, *prev = l; /* se la lista è vuota, restituisce NULL */ if (l == NULL) return NULL; /* per ogni elemento della lista */ do { /* elemento successivo */ l2 = l2->next; /* se trova lelemento */ if (l2->el == x) { /* ed è lunico elemento */ if (prev == l2) { free(l2); return NULL; } /* altrimenti salta lelemento da cancellare */ prev->next = l2->next; free(l2); return prev; } prev = l2; } while(l2 != l); return l; }
7
Esercizio 3 Scrivere una funzione per concatenare due liste circolari. La funzione dovrà restituire una puntatore allultimo nodo della nuova lista circolare. Pre condizioni: la funzione prende in ingresso due liste circolari L1 e L2 Post condizioni: La funzione restituisce il puntatore allultimo nodo di L2
8
Svolgimento struct list *concatena(struct list *l1, struct list *l2) { struct list *h1; /* se una delle due liste è vuota, restituisce laltra lista circolare */ if (l1 == NULL) return return l2; if (l2 == NULL) return return l1; h1 = l1->next; l1->next = l2->next; l2->next = h1; return l2; }
9
Esercizio 5 Scrivere una funzione per invertire una lista circolare Pre condizioni: la funzione prende in ingresso una lista circolare L Post condizioni: La funzione restituisce il puntatore allultimo nodo della lista L invertita
10
Svolgimento Due possibili implementazioni: –iterativa –ricorsiva
11
Soluzione ricorsiva Casi base: 1.lista vuota (si restituisce immediatamente NULL) 2.ultimo elemento da invertire Caso ricorsivo sul generico elemento l: –Memorizzare il puntatore allelemento successivo (n = l->next) –Richiedere linversione della parte rimanente della lista (puntata da l->next) –Invertire lelemento n->next = l
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.