Vi prego di darmi una mano perchè ho la consegna entro domani e non riesco proprio a venirne a capo. questo è il programma per intero fatto e sistemato seguendo i vostri consigli:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define max 500
typedef struct dati_libro{
    int codice;
    char autore[20];
    char titolo[20];
    char chiave[5][50];
}dati_libro;
typedef struct nodo{
    dati_libro *ele;
	struct nodo *next;
}nodo;        
typedef struct biblioteca{
    nodo *lista;
}biblioteca;
        
void inserisci_testa(nodo **testa, dati_libro *libro){
	nodo *new = malloc(sizeof(nodo)); //creazione del nuovo nodo
	new->ele = libro;
	new->next = *testa;               //aggancio in testa
	*testa = new;                     //aggiornamento del puntatore alla testa
}
	 
biblioteca dati;                                
int inserisci_libro(){                               //funzione per inserire i dati del libro
	int aggiungi, i;
	
  	dati_libro *libro = malloc(sizeof(dati_libro));
    printf("aggiungi dati libro\n");
    printf("inserire codice libro :\n");
	scanf("%d", &libro->codice);
    printf("inserire autore:");
    while(getchar() != '\n');
    fgets(libro->autore, 20, stdin);
    printf("inserire titolo:");
  //  while(getchar() != '\n');
    fgets(libro->titolo, 20, stdin);
  
    printf("inserire 5 parole chiave\n");
    for(i=0;i<5;i++){                                                //ciclo for per inserire 5 parole chiavi per ogni libro inserito
  	    printf("inserire parola chiave numero %d:\n", i+1);
        scanf("%s", libro->chiave[i]);
        printf("hai inserito: %s\n", libro->chiave[i]);
    }
	inserisci_testa(&dati.lista, libro);
	free(libro);
	return aggiungi;
}
                
int inserisci(){
    int aggiungi;
    do{
	    aggiungi = inserisci_libro();
    } while(aggiungi!=0);
}
void stampa(dati_libro *libro){                      
    printf("codice del libro e': %d\n", libro->codice);
	printf("il titolo del libro e': %s\n", libro->titolo);
	printf("l'autore e': %s\n", libro->autore);
	printf("\n");
}
void visualizza3(){
 	char parola[3][20];
    int a, b, c;
    int count;
    nodo *p;
	printf("per visualizzare il libro cercato inserire 3 parole chiave\n");
    for(a=0;a<3;a++){
        printf("inserire la %d parola chiave\n", a+1);
	    scanf("%s", parola[a]);
    }
	for(p=dati.lista; p!=NULL; p=p->next){ //scorro la lista
	    count=0;
        for(b=0; b<3; b++) //ogni parola chiave cercata
            for(c=0; c<5; c++) //viene confrontata con le 5 parole chiave del libro
            //se la parola corrisponde incremento count e passo alla prossima parola chiave da cercare
                if(strcmp(parola[b], p->ele->chiave[c]) == 0){ 
	                count++; 
	                break;
	            }
        if(count==3) //tutte e tre le parole sono state trovate
            stampa(p->ele);
	 }
}
void visualizza1(){   //funzione per inserire 3 parole chiavi per cercare il libro 
 	char parola[3][20];
    int a, b, c;
    int count;
    nodo *p;
	printf("per visualizzare il libro cercato inserire 3 parole chiave\n");
	for(a=0;a<3;a++){
        printf("inserire la %d parola chiave\n", a+1);
	    scanf("%s", parola[a]);
	}
	for(p=dati.lista; p!=NULL; p=p->next){
	    count=0;
        for(b=0; b<3; b++){
            for(c=0; c<5; c++){
                if(strcmp(parola[b], p->ele->chiave[c])==0){
			  //se una parola corrisponde metto count = 1 e termino il for interno
	                count=1;
				    break;
                }
	        }
		    if(count == 1){
		 		  //se count == 1 stampo i dati e termino il for intermedio
	 		    stampa(p->ele);
		        break;
		    }         
        }
    }
}
void visualizza_tutto(){   //funzione per visualizzare l'intera libreria 
    nodo *p;
	
	for(p=dati.lista; p!=NULL; p=p->next){
	 		    stampa(p->ele);
		    }       
        }
	
void rimuovi_lista(int codice){ //funzione per rimuovere il libro
	nodo *p, *q = NULL;
	for(p=dati.lista; p!=NULL && p->ele->codice != codice; p=p->next)
	    q = p;
    if(p == NULL) //se il libro non è presente nella biblioteca stampo:"..."
        printf("il libro non e' presente nella biblioteca\n");
    else{       //nel caso in cui trovo il libro nella biblioteca tramite la funzione "free" rimuovo il libro dalla biblioteca
        if(q == NULL)
            dati.lista = p->next;
        else
		    q->next = p->next;
		free(p);
		printf("libro #%d rimosso con successo\n", codice);
	}
}
void rimuovi(){
    int codice;
    printf("inserisci il codice del libro da rimuovere: ");
    scanf("%d", &codice);
    rimuovi_lista(codice);
}
void salva(){
	FILE *file = fopen("save.txt","w");  //qui salvo il file in scrittura
	nodo *p;
	for(p=dati.lista; p!=NULL; p=p->next){                            
	    fprintf(file, "%d %s %s %s %s %s %s %s\n", p->ele->codice, p->ele->autore, p->ele->titolo, p->ele->chiave[0], p->ele->chiave[1], p->ele->chiave[2], p->ele->chiave[3], p->ele->chiave[4]);
	}
	fclose(file); 
}
void carica(){
	FILE *file;
	dati_libro *ele;         
	int esito;
    dati.lista = NULL;
    file = fopen("save.txt","r");
	if(file == NULL)
	    return;
	while(1){                            
        ele = malloc(sizeof(dati_libro));
	    esito = fscanf(file, "%d %s %s %s %s %s %s %s\n", &ele->codice, ele->autore, ele->titolo, ele->chiave[0], ele->chiave[1], ele->chiave[2], ele->chiave[3], ele->chiave[4]);
	    if(esito == EOF)
	        break;
        inserisci_testa(&dati.lista, ele);
	}
	fclose(file); 
	free(ele);
}
int menu()
{
   int k = 0;
   int result = 0;
   char svuota[100];
   do
   {
      printf("\n\t|1.inserire libro.|\n");
      printf("\t|2.rimuovere libro.|\n");
      printf("\t|3.visualizza libro con almeno una parola chiave uguale.|\n");
      printf("\t|4.visualizza libro con 3 parole chiave uguali.|\n");
	  printf("\t|5.visualizza tutta la libreria.|\n"); 
      printf("\t|6.termina|\n\n");
      fflush(stdout);
      result = scanf("%d", &k);
      if(result != 1)
      {
         printf("Input non corretto (si  accettano solo numeri), riprova!!!!\n\n");
         scanf("%s",svuota);
         continue;
      }
      switch(k)
      {
         case 1:
            inserisci_libro();
            salva();
            menu();
            
         break;
         case 2:
         	carica();
            rimuovi();
            menu();
            salva();
         break;
         case 3:
            carica();
            visualizza1();
            menu();
         break;
         case 4:
         	carica();
            visualizza3();
            menu();
         break;
         case 5:
         	carica();
         	visualizza_tutto();
         	menu();
         break;
         case 6:
         	carica();
         	salva();
         	break;
			exit(0);
         	default:
         {
            printf("Input non corretto, inserire numeri da 1 a 6, riprova.\n\n");
         }
         break;
      }
   }while(k != 6);
   return k;
}
/*
void salva(){
	FILE *file = fopen("save.txt","w");  //qui salvo il file in scrittura
	nodo *p;
	for(p=dati.lista; p!=NULL; p=p->next){                            
	    fprintf(file, "%d %s %s %s %s %s %s %s\n", p->ele->codice, p->ele->autore, p->ele->titolo, p->ele->chiave[0], p->ele->chiave[1], p->ele->chiave[2], p->ele->chiave[3], p->ele->chiave[4]);
	}
	fclose(file); 
}
void carica(){
	FILE *file;
	dati_libro *ele;         
	int esito;
    dati.lista = NULL;
    file = fopen("save.txt","r");
	if(file == NULL)
	    return;
	while(1){                            
        ele = malloc(sizeof(dati_libro));
	    esito = fscanf(file, "%d %s %s %s %s %s %s %s\n", &ele->codice, ele->autore, ele->titolo, ele->chiave[0], ele->chiave[1], ele->chiave[2], ele->chiave[3], ele->chiave[4]);
	    if(esito == EOF)
	        break;
        inserisci_testa(&dati.lista, ele);
	}
	fclose(file); 
}
*/
int main(){          
    menu();
    return 0;
} 
il programma ha qualche problema nella funzione inserisci_libro con le fgets poiche quando poi vado a stampare non sempre stampa ad esempio il titolo o l'autore e mentre inserisco il titolo mi considera anche come carattere l'invio.
problema ancora più grande la funzione carica poichè quando la utilizza mi si riempie tutta la ram e gran parte della memoria del disco rigido.
spero mi possiate aiutare grazie mille