Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- struct Lista {
- int data;
- Lista* next;
- };
- // Elimina l'intera lista list.
- void list_delete(Lista* list) {
- if (list != NULL) {
- list_delete(list->next);
- delete list;
- }
- }
- // Elimina la testa di list e restituisce la nuova testa.
- Lista* list_delete_head(Lista* list) {
- Lista* new_head = list->next;
- delete list;
- return new_head;
- }
- // Aggiunge un elemento alla testa di list, o crea una nuova lista se list è NULL.
- Lista* list_add_elem(Lista* list, int val) {
- return new Lista { val, list };
- }
- // Aggiunge i primi n_vals valori da vals all'inizio di list, e restituisce la nuova testa.
- Lista* list_add_elems(Lista* list, int vals[], int n_vals) {
- if (n_vals > 0) {
- list = list_add_elems(list, vals + 1, n_vals - 1);
- list = list_add_elem(list, vals[0]);
- }
- return list;
- }
- // Restituisce il primo nodo in list che ha valore val.
- Lista* list_search(Lista* list, int val) {
- if (list == NULL)
- return NULL;
- else if (list->data == val)
- return list;
- else
- return list_search(list->next, val);
- }
- // Stampa list su stdout.
- void list_print(Lista* list) {
- if (list != NULL) {
- cout << list->data << " ";
- list_print(list->next);
- }
- }
- // Restituisce la lunghezza di list.
- int list_length(Lista* list) {
- if (list == NULL)
- return 0;
- else
- return 1 + list_length(list);
- }
- // Conta le istanze di val in list.
- int list_count(Lista* list, int val) {
- if (list == NULL)
- return 0;
- else
- return (list->data == val) + list_count(list->next, val);
- }
- // Cancella elem da list, e restituisce la nuova testa di list.
- Lista* list_delete_elem(Lista* list, Lista* elem) {
- if (list != NULL) {
- Lista* next = list->next;
- if (list == elem)
- return list_delete_head(list);
- if (next != NULL)
- list->next = list_delete_elem(next, elem);
- }
- return list;
- }
- // Cancella tutte le istanze di val in list e restituisce la nuova testa di list.
- Lista* list_cancella(Lista* list, int val) {
- if (list != NULL) {
- Lista* next = list->next;
- if (next != NULL)
- list->next = list_cancella(next, val);
- if (list->data == val)
- return list_delete_head(list);
- }
- return list;
- }
- // Restituisce la testa di una copia di list.
- Lista* list_copia(Lista* list) {
- if (list == NULL)
- return NULL;
- Lista* copia_nodo = list_add_elem(NULL, list->data);
- copia_nodo->next = list_copia(list->next);
- return copia_nodo;
- }
- // Elimina l'ultimo elemento di list.
- Lista* list_delete_tail_elem(Lista* list) {
- if (list != NULL) {
- if (list->next == NULL)
- return list_delete_head(list); // Restituisce sempre NULL.
- list->next = list_delete_tail_elem(list->next);
- }
- return list;
- }
- // Inserisce un elemento in list, solo se non esiste già. (aggiunta a set)
- Lista* list_add(Lista* list, int val) {
- if (list_search(list, val) == NULL)
- return list_add_elem(list, val);
- return list;
- }
- // Restituisce la testa di una nuova lista, quale risultato dell'unione insiemistica tra a e b.
- Lista* list_union(Lista* a, Lista* b) {
- if (a == NULL && b == NULL)
- return NULL;
- Lista* risultato;
- if (a == NULL)
- risultato = list_union(NULL, b->next);
- else if (b == NULL)
- risultato = list_union(a->next, NULL);
- else
- risultato = list_union(a->next, b->next);
- if (a != NULL)
- risultato = list_add(risultato, a->data);
- if (b != NULL)
- risultato = list_add(risultato, b->data);
- return risultato;
- }
- // Restituisce la testa di una nuova lista, quale risultato dell'intersezione insiemistica tra a e b.
- Lista* list_intersect(Lista* a, Lista* b) {
- if (a == NULL || b == NULL)
- return NULL;
- Lista* risultato = list_intersect(a->next, b);
- if (list_search(b, a->data))
- risultato = list_add(risultato, a->data);
- return risultato;
- }
- // Restituisce la testa di una nuova lista, quale risultato della differenza insiemistica a - b.
- Lista* list_difference(Lista* a, Lista* b) {
- if (a == NULL || b == NULL)
- return NULL;
- Lista* risultato = list_difference(a->next, b);
- if (!list_search(b, a->data))
- risultato = list_add(risultato, a->data);
- return risultato;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement