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