I typedef sono errati perche definisci due volte il tipo Libro forse volevi scrivere
codice:
typedef enum Tipo{Romanzo,Saggio, Viaggi,Scolastico} Tipo;
typedef struct{
char *autore;
char *titolo;
Tipo libro;
int data[3];
}Libro;
typedef struct Libreria{
Libro item;
struct Libreria* next;
}Libreria;
a parte questo, se le istruzioni che hai scritto con strcpy sono legali solo se hai allocato spazio per il puntatore autore e titolo, ad esempio:
codice:
Libreria *lib = (Libreria*)malloc(sizeof(Libreria));
//alloco spazio per i campi stringa che devono contenere
//stringhe lunghe al massimo 99 caratteri
lib -> autore = (char *)malloc(sizeof(char) * 100);
lib -> titolo = (char *)malloc(sizeof(char) * 100);
//imposto i valori dei campi stringa
strcpy(lib ->autore,"Petrarca");
strcpy(li ->titolo,"Abracadabra");