Salve a tutti! Sto avendo problemi nella risoluzione di un esercizio riguardante una lista che ordini un insieme di libri per campi. Principalmente non riesco a capire come poter ordinare le varie strutture secondo quanto richiesto nel primo punto dell'esercizio ed infine, per quanto riguarda l'ultimo punto ("cercare un libro in relazione ad uno specifico campo"), non riesco a far funzionare la funzione search in list con titoli e/o autori qualora dovessero presentare spazi nei rispettivi campi. Posto il codice:
/*
Creare un programma che attraverso una struttura collegata, permetta di gestire le
informazioni riguardanti un insieme di libri. Per ogni libro si considerino le
informazioni: codice ISBN, titolo, autore.
Il programma consenta di :
•memorizzare i libri secondo l’ordine dato dal codice ISBN. (usare la qsort ?)
•Salvare i dati su un file DONE
•Leggere da file i dati precedentemente immessi (stampare su schermo tutto quello scritto in file) DONE
•Cercare un libro in relazione ad uno specifico campo (dalle liste e non da file)
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct libro {
char isbn[17];
char titolo[50];
char autore[30];
struct libro *next;
};
typedef struct libro libro;
void print_list_infile(libro *head, FILE *fp);
libro *search_in_list1(libro *head, char isbn[]);
libro *search_in_list2(libro *head, char titolo[]);
libro *search_in_list3(libro *head, char autore[]);
libro *add_to_list(libro *head, char isbn[], char titolo[], char autore[]);
int main() {
FILE *fp;
int i;
char titolozzo[50];
char *s;
char c, z;
char temp_isbn[17];
char temp_autore[30];
char temp_titolo[50];
s=temp_titolo;
libro *head=NULL;
libro *ps, *cs, *ds;
strcpy(temp_isbn, "");
while(1)
{
i=1;
printf("Codice ISBN: ");
scanf("%s", temp_isbn);
if(strcmp(temp_isbn, "-1")==0)
break;
while((c=getchar())!='\n');
printf("Titolo: ");
scanf("%[^\n]s", temp_titolo);
while((c=getchar())!='\n');
printf("Autore: ");
scanf("%[^\n]s", temp_autore);
while((c=getchar())!='\n');
i++;
head=add_to_list(head, temp_isbn, temp_titolo, temp_autore);
} /*chiude il while(1)*/
qsort(head->isbn, i, 17, (int (*)(const void *, const void *))strcmp);
fp=fopen("lista_libri.txt", "w");
print_list_infile(head, fp);
fclose(fp);
fp=fopen("lista_libri.txt", "r");
if(fp) {
while((c = getc(fp)) != EOF)
putchar(c);
fclose(fp);
}
while(1) {
printf("Digitare 1 per ISBN, 2 per TITOLO, 3 per AUTORE, 4 per USCIRE: ");
scanf("%s", &z);
switch(z) {
case '1':
scanf("%s", temp_isbn);
ps=search_in_list1(head, temp_isbn);
break;
case '2':
//scanf("%s", temp_titolo);
//scanf("%[^\n]s", temp_titolo);
//while((c=getchar())!='\n');
scanf("%[^\n]s", titolozzo);
while((c=getchar())!='\n');
cs=search_in_list2(head, titolozzo);
break;
case '3':
//scanf("%[^\n]s", temp_autore);
//scanf("%s", temp_autore);
fgets(temp_autore, 30, stdin);
//while((c=getchar())!='\n');
ds=search_in_list3(head, temp_autore);
break;
case '4':
return 0;
} /*chiude il while interno*/
} /*chiude il while(1)*/
fclose(fp);
} /*chiude il main*/
libro *search_in_list1(libro *head, char isbn[]) {
if(head==NULL)
return NULL;
while(head!=NULL)
{
if(strcmp(head->isbn, isbn)==0){
printf("--%s %s %s--\n", head->isbn, head->titolo, head->autore);
return head;}
head=head->next;
}
return NULL;
}
libro *search_in_list2(libro *head, char titolo[]) {
if(head==NULL)
return NULL;
while(head!=NULL)
{
if(strcmp(head->titolo, titolo)==0) {
printf("--%s %s %s--\n", head->isbn, head->titolo, head->autore);
return head; }
head=head->next;
}
return NULL;
}
libro *search_in_list3(libro *head, char autore[]) {
if(head==NULL)
return NULL;
while(head!=NULL)
{
if(strcmp(head->autore, autore)==0) {
//fscanf(fp, "%s\n", autore);
printf("--%s %s %s--\n", head->isbn, head->titolo, head->autore);
return head; }
head=head->next;
}
return NULL;
}
libro *add_to_list(libro *head, char isbn[], char titolo[], char autore[])
{
libro *p, *t;
p=(libro *)malloc(sizeof(libro));
strcpy(p->isbn, isbn);
strcpy(p->titolo, titolo);
strcpy(p->autore, autore);
p->next=NULL;
t=head; //puntatore temporaneo è t
if(head==NULL)
return p;
while(t->next!=NULL)
t=t->next;
t->next=p;
return head;
}
void print_list_infile(libro *head, FILE *fp) {
int i=1;
while(head!=NULL)
{
fprintf(fp, "%d) %s %s %s\n", i++, head->isbn, head->titolo, head->autore);
head=head->next;
}
}
Nel codice trovetere sicuramente cose in più inutilizzate, risultato di tante prove non andate a buon fine