oregon ha scritto:
Prima di tutto si deve capire quali sono i dati e come è fatta la lista. Questo ancora non si è capito.
Quali sono le strutture dati e come sono collegate?
Cosa c'è scritto nel file che devi leggere?
Devi essere molto precisa nelle risposte alle domande ...
liste semplici
c'è scritto il titolo, autore e codice id
diciamo che sono riuscita a stampare la lista anche se non vengono stampati tutti i 15 libri...riposto il codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 100
struct libri{
char titolo[100];
char autore[100];
int cod_id;
struct libri *next;
};
typedef struct {
struct libri elementi[100];
int num_libri;
}Libro;
int Cerca_Titolo(Libro list ,char titolo);
struct libri initList(char titolo,char autore,int cod_id);
struct libri insertHead(struct libri L, char titolo,char autore, int cod_id);
//struct libri *CREA_LISTA(struct libri *TOP);
int menu();
struct libri *leggiFile(FILE *fp, struct libri *lista);
void scriviLista(struct libri *lista);
void scriviFile(FILE *fp, struct libri *lista);
static struct libri *inserisciLista(struct libri *nodo, struct libri *lista);
static struct libri *nuovoNodo(char *titolo,char *autore, int cod_id);
static void freeNodo(struct libri *nodo);
void gestioneErrore();
void freeLista(struct libri *lista);
void stampaLista(struct libri *top);
int main() {
int scelta;
FILE *fp;
struct persona *lista=NULL;
struct lista *top = NULL;
int cod_id;
char titolo;
char autore;
struct libri L;
int presenza;
Libro l;
//lista = nuovoNodo(titolo,autore,cod_id);
//CREA_LISTA(lista);
//lista = inserisciLista(L,autore);
while((scelta = menu())){
switch (scelta) /* Creo uno switch con 5 case, uno per ogni possibile scelta */
{
case 1: /*stampa lista*/
fp = fopen("Libri.txt","r");
lista = leggiFile(fp, lista);
fclose(fp);
scriviLista(lista);
//stampaLista(top);
break;
case 2: /* Se l'utente preme il tasto 2 si cerca se c'e il libro e richiedere un libro tramite il codice*/
printf("\nInserisci titolo libro da richiedere:");
fflush(stdin);
gets(titolo);
fp = fopen("Libri.txt","r");
lista = leggiFile(fp, lista);
fclose(fp);
scriviLista(lista);
presenza = Cerca_Titolo(l,titolo);
if(titolo != -1) {
printf("Il libro cercato e' presente nell'archivio ed il libro e' disponibile\n");
// l = Inserimento_Studente();
} else {
printf("Il libro cercato non e' presente nell'archivio ed il libro non e' disponibile\n");
}
fclose(fp);
break;
case 3: /* Case costruito per restituire un libro tramite codice*/
break;
case 4: /*esegui richiesta*/
break ;
case 5: /*Se l'utente vuole uscire dalla biblioteca*/
printf("Grazie per aver scelto il servizio di gestione della biblioteca, torna a trovarci!\n");
break;
default: /*Se l'utente sbaglia ad inserire il numero*/
printf("Questo tasto non consente di effetuare scelte! Riprova!\n");
break;
} /*Fine switch*/
} /*Fine do*/
return scelta;
} /*Fine main*/
int menu(){
int scelta; /*Questa variabile sarà utilizzata nella switch per decidere che cosa fare...*/
printf("* * * * * * * * * * * * * * * * * * * \nBenvenuto nel programma di gestione biblioteca\n* * * * * * * * * * * * * * * * * * * \n");
printf(" 1. Mostra archivio\n");
printf(" 2. Richiedi libro\n");
printf(" 3. Restituire libro\n");
printf(" 4. Esegui richiesta\n");
printf(" 5. Uscire\n");
printf("Inserisci scelta:");
scanf("%d",&scelta); /*Viene inserito nella variabile var il numero inserito dall'utente e di conseguenza inserito nel ciclo Switch*/
while(scelta<0 || scelta>5) { printf("Questo tasto non consente di effetuare scelte! Riprova!\n");
printf("Scelta: ");
scanf("%d", &scelta);
return scelta;
}
return scelta;
}
static struct libri *nuovoNodo(char *titolo,char *autore, int cod_id)
{
struct libri *nodo;
nodo = (struct libri *) malloc(sizeof(struct libri));
if (nodo == NULL) return NULL;
strcpy(nodo->titolo,titolo);
strcpy(nodo->autore, autore);
nodo->cod_id =cod_id;
nodo->next = NULL;
return nodo;
}
static void freeNodo(struct libri *nodo)
{
free((void *) nodo);
}
static struct libri *inserisciLista(struct libri *nodo, struct libri *lista)
{
if (lista==NULL) return nodo;
lista->next = inserisciLista(nodo, lista->next);
return lista;
}
void gestioneErrore()
{
printf("Errore\n");
exit(0);
}
void freeLista(struct libri *lista)
{
if (lista != NULL) {
freeLista(lista->next);
freeNodo(lista);
}
}
void scriviLista(struct libri *lista)
{
while (lista!=NULL) {
printf("%s %s %d\n",lista->titolo,lista->autore,lista->cod_id);
lista = lista->next;
}
printf("\n");
}
struct libri *leggiFile(FILE *fp, struct libri *lista)
{
char titolo[256], autore[256];
int cod_id;
struct libri *nodo;
while(fscanf(fp,"%s%s%d",titolo,autore,&cod_id)==3){
nodo = nuovoNodo(titolo,autore,cod_id);
if (nodo == NULL)
gestioneErrore();
lista = inserisciLista(nodo, lista);
}
return lista;
}
void scriviFile(FILE *fp, struct libri *lista)
{
while (lista!=NULL) {
fprintf(fp,"%s %s %d \n",lista->titolo,lista->autore,lista->cod_id);
lista = lista->next;
}
}
void stampaLista(struct libri *top)
{
if (top == NULL) {
printf("\n--------------\n\n");
}else
if (top!=NULL && top->titolo!=0) {
printf("%s %s %d", top->titolo, top->autore, &top->cod_id);
stampaLista(top->next);
}
}
//struct libri *CREA_LISTA(struct libri *TOP){
//struct libri *tmp=(struct libri*)malloc(sizeof(struct libri));
//tmp->next=TOP;
//strcpy(tmp->titolo,TOP->titolo);
//strcpy(tmp->autore,TOP->autore);
//tmp->cod_id=TOP->cod_id;
//return tmp;
//}
int Cerca_Titolo(Libro list ,char titolo){
int j;
int presenza=-1;
for(j=0; j<list.num_libri; j++) {
if(strcmp(list.elementi[j].titolo, &titolo)==0){
presenza=1;
}
}
return presenza;
}