Seguendo la soluzione con i puntatori ho gestito la cosa nel modo seguente: 
struct libro{
       char *autore;
       char *titolo;
       char *editore;
       int anno;
       int copie;
       struct libro *next;
};
/*Inserimento di un libro nella lista*/
int inserisci(){
    struct libro *l, *prev, *cur;
    char a[DIM], t[DIM], e[DIM];
    
    l=malloc(sizeof(struct libro));
    if(l==NULL){
                printf("la biblioetca è piena\n");
                return 0;
    }
    printf("inserisci autore: ");
    fgets(a, sizeof(a) ,stdin);
    l->autore=malloc((strlen(a)+1)*sizeof(char));  
    strcpy(l->autore,a);  
    printf("inserisci titolo: ");
    fgets(t, sizeof(t), stdin);
    l->titolo=malloc((strlen(t)+1)*sizeof(char));
    strcpy(l->titolo,t);
    
    for (cur = biblioteca, prev = NULL; 
        cur!=NULL && (strcmp(cur->autore,a)!=0 || strcmp(cur->titolo,t)!=0);
              prev=cur, cur=cur->next)
              ;
    if(cur!=NULL){
            printf("il libro e' gia' stato registrato\n"); 
                  return 0;         
    }
    
    printf("inserisci editore: ");
    fgets(e, sizeof(e), stdin);
    l->editore=malloc((strlen(a)+1)*sizeof(char));
    strcpy(l->editore,e);
    printf("insersci anno: ");
    scanf("%d",&l->anno);
    fflush(stdin);
    printf("inserisci copie: ");
    scanf("%d",&l->copie);
    fflush(stdin);
    l->next=cur;
    if(prev==NULL){
                   biblioteca=l;
    }
    else 
         prev->next=l;
    return 1;
}
Sono corretti questi passaggi?