#include <stdio.h>
#include <stdlib.h>
/*
Liste - definizione
Liste - funzioni di creazione, distruzione, stampa, lunghezza, lista vuota
Liste - funzioni di accesso, inserimento, ordinamento
*/

typedef struct _elem {
    int data;
    struct _elem * next;
} elem;


elem *get(elem *l, int i);

/* Crea un nuovo elemento con valore d */
elem *new(int d);

/* Inserisce un elemento con valore d in testa alla lista */
elem *ins_head(elem *l, int d);

/* Inserisce un elemento con valore d in coda alla lista (forma ricorsiva) */
elem *ins_tail(elem *l, int d);

/* Inserisce un elemento con valore d in coda alla lista (forma iterativa) */
elem *ins_tail_iter(elem *l, int d);

/* Inserisce un nuovo elemento con valore d alla posizione i-esima della lista */
elem *ins_at(elem *l, int i, int d);

/* l1 -> l2 aggancia la seconda lista in coda alla prima */
elem *cat(elem *l1, elem *l2);

/* Rimuove l'elemento item dalla lista l */
elem *remv(elem *l, elem *item);

/* Rimuove l'elemento i-esimo dalla lista l */
elem *remove_at(elem *l, int i);

/* Dealloca l'intera lista */
void destroy(elem *l);

elem *get(elem *l, int i);

/* Cambia il valor dell'i-esimo elemento in val, se esiste tale elemento */
elem *set(elem *l, int i, int val);

/* Lunghezza della lista (forma ricorsiva) */ 
int length(elem *l);

/* Lunghezza della lista (forma iterativa) */
int len(elem *l);

/* Stampa la lista*/
void print(elem *l);

elem *find(elem *l, int d);

elem *find_iter(elem *l, int d);

elem *reverse(elem *l);

elem *ins_order(elem *l, int d);

elem *ins_sort(elem *l);

/* fusione di liste ordinate */
elem *merge(elem *l1, elem *l2);

/* copia di lista */
elem *copy(elem *l);

int test();
