Liste in c

di il
14 risposte

Liste in c

Scusate se lo ripubblico ma ho modificato un po di cose solo che non mi fa fare la ricerca c'è anche se inserisco il libro che nel file non ce mi dice che è presente.. penso perché non ho un collegamento tra liste e file potete aiutarmi a realizzarlo?

#include <stdio.h>


#include <stdlib.h>


#define len 35


typedef struct {


    char nome;


   char cognome;


    char matricola;


  struct Studente *next;


}Studente;





typedef struct {


    Studente element[len];


    int num_studente;


}List;





struct lista


{


char titolo[len];


char autore;


int cod_id;


struct lista *next;


};





typedef struct {


    struct lista elementi[len];


   int num_libri;


}Libro;





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;


}





struct lista *creaNodo(FILE *fp)


{


    struct lista *temp=(struct lista *)malloc(sizeof(struct lista ));





    fscanf(fp, "%s %s %d", temp->titolo, temp->autore, &temp->cod_id);


    temp->next=NULL;





return (temp);


}





void stampaLista(struct lista *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);


        


    }


}





FILE *apriFile(FILE *fp)


{


    fp=fopen("Libri.txt", "r");


    if (fp==NULL)


    {


    perror("");


    exit(1);


    }





return (fp);


}


 


struct lista *CREA(struct lista *TOP){


struct lista *tmp=(struct lista*)malloc(sizeof(struct lista));


tmp->next=TOP;


strcpy(tmp->titolo,TOP->titolo);


strcpy(tmp->autore,TOP->autore);


tmp->cod_id = TOP->cod_id;


return tmp;


}





int menu(){


    int scelta; /*Questa variabile sarà utilizzata nella switch per decidere che cosa fare...*/


    //char nome;//utilizzata per inserire il nome dell'utente


    //char matricola;//utilizzata per inserire la matricola dello studente


 printf("\n* * * * * * * * * * * * * * * * * * * * * * *\nBenvenuto nel programma di gestione biblioteca\n* * * * * * * * * * * * * * * * * * * * * * *\n");


    //printf("Inserisci il nome:");


    //scanf("%s", &nome);


   // printf("Inserisci il matricola:");


    //scanf("%s", &matricola);


    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;


}





List Inserimento_Studente(){


   List lista;


   int i;


   printf("\nQuanti libri vuoi restituire?:");


    scanf("%d",&lista.num_studente);


   fflush(stdin);


   for(i=0; i <lista.num_studente; i++) {


        printf("\nInserisci nome: ");


       gets(&lista.element[i].nome);


        printf("\nInserisci cognome: ");


       gets(&lista.element[i].cognome);


       printf("\nInserisci matricola: ");


        scanf("%s", &lista.element[i].matricola);


        fflush(stdin);


 }


    return lista;


}





int main() {





char buf[200];


char *res;


FILE *fp=NULL;


int scelta;


struct lista *top=NULL;


char titolo[len];


int presenza;


Libro L;


List l;








while((scelta = menu())){


  


    switch (scelta) /* Creo uno switch con 5 case, uno per ogni possibile scelta */


{


 case 1: /*stampa lista*/


         /* apre il file */


        fp=apriFile(fp);





            while (!feof(fp))


            {


            res=fgets(buf, 200, fp);


            if( res==NULL )


              break;


            printf("%s", buf);


            }


        fclose(fp); /* chiudo il puntatore a file gestito in READ */





        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=apriFile(fp);








           while(!feof(fp)) {








        presenza = Cerca_Titolo(L,titolo);








                if(titolo != -1) {








                    printf("Il libro cercato non e' presente nell'archivio ed il libro non 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*/







14 Risposte

  • Re: Liste in c

    Tutte le strutture sono sballate. Per le stringhe come cognome e altre usi un char al posto di un vettore di char...

    Tutto da rifare...
  • Re: Liste in c

    oregon ha scritto:


    Tutte le strutture sono sballate. Per le stringhe come cognome e altre usi un char al posto di un vettore di char...

    Tutto da rifare...
    okay provo a fare una cosa alla volta...parto dal collegare i dati dal file alla lista
    
    #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;
    };
    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;
    
        
    lista = nuovoNodo(titolo,autore,cod_id);
    CREA_LISTA(lista);
    
    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");
               if (fp == NULL)
                   gestioneErrore();
             
            lista = leggiFile(fp, lista);
             
                fclose(fp);
    
            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*/
    
    
    
    
    
            
               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;
    }
    
    ora per far ciò prima del main dovrei aggiungere la funzione di che nodo , inserisci elementi in lista ed tra lista...giusto? Pero ora nel case come faccio a stampare i dati sempre riferendomi al file?
  • Re: Liste in c

    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 ...
  • Re: Liste in c

    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;
    
    }
    
    
    
    
    
    
  • Re: Liste in c

    Quindi mi mostri le linee contenute nel file?
  • Re: Liste in c

    oregon ha scritto:


    Quindi mi mostri le linee contenute nel file?
    signore Redfield 34554
    Potter Coelho 57777
    La Bianchi 85345
    Piccole Piero 60543
    Guarnizione Napoleton 14532
    nome Louise 10543
    vento Jerry 35435
    Odissea Bryne 40435
    Cuore Marchesi 12534
    Malavoglia Valeria 45433
    Siddharta Still 245567
    Lolita Wilcox12534
    Amabili Pone 35453
    notre Boldi 15348
    Possession Esposito 55435
  • Re: Liste in c

    Ok ma il tuo codice non è compilabile (non l'hai mai compilato?) ci sono una marea di errori.

    Ti avevo già detto, ad esempio, che

    char titolo;

    significa che la variabile è fatta da UN SOLO carattere e non è una stringa.
    Non puoi quindi utilizzarla come una stringa.

    Elimina tutti questi errori banali e riproponi il codice corretto.
  • Re: Liste in c

    oregon ha scritto:


    Ok ma il tuo codice non è compilabile (non l'hai mai compilato?) ci sono una marea di errori.

    Ti avevo già detto, ad esempio, che

    char titolo;

    significa che la variabile è fatta da UN SOLO carattere e non è una stringa.
    Non puoi quindi utilizzarla come una stringa.

    Elimina tutti questi errori banali e riproponi il codice corretto.
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    struct libri{
        char titolo[10];
        char autore[10];
        int cod_id;
        struct libri *next;
    };
    
    typedef struct {
        struct libri elementi[100];
       int num_libri;
    }Libro;
    
    int Cerca_Titolo(Libro list ,char titolo[10]);
    struct libri initList(char titolo[10],char autore[10],int cod_id);
    struct libri insertHead(struct libri L, char titolo[10],char autore[10], 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[10],char *autore[10], 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;
        
        char titolo[10];
      
    
        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);
            
            
        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[10]);
        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[10],char *autore[10], 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[10], autore[10];
      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[10]){
    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;
    
    }
    
    
    cosi?
  • Re: Liste in c

    Hai titoli e autori di 10 caratteri nel tuo elenco?

    E cosa è elementi? Non serve a niente. Va tutto rivisto a partire dalle strutture dati.

    Devi fermarti e studiare le parti TEORICHE del linguaggio o non ci sarà mai un codice funzionante. Se confondi chat con stringhe non siamo messi bene.
  • Re: Liste in c

    oregon ha scritto:


    Hai titoli e autori di 10 caratteri nel tuo elenco?

    E cosa è elementi? Non serve a niente. Va tutto rivisto a partire dalle strutture dati.

    Devi fermarti e studiare le parti TEORICHE del linguaggio o non ci sarà mai un codice funzionante. Se confondi chat con stringhe non siamo messi bene.
    elementi è il numero di elementi dei libri e poi so la distinzione tra char e stringhe e che prima creo la struttura con le funzioni e poi modifico nomi e dimensioni...vabbè scusa per averti fatto perdere tempo..
  • Re: Liste in c

    Ma cosa è un numero di elementi fatti capire. Hai una lista e in una lista il numero di elementi è potenzialmente infinito. Hai capito cosa è una lista e come viene rappresentata in memoria e dal linguaggio? Fai confusione con gli array?

    Usi i char e li usi per inserire stringhe e ovviamente il compilatore non può compilare e non puoi provare il programma.

    Stai perdendo tempo tu... se non studi perdi tempo tu
  • Re: Liste in c

    oregon ha scritto:


    Hai titoli e autori di 10 caratteri nel tuo elenco?

    E cosa è elementi? Non serve a niente. Va tutto rivisto a partire dalle strutture dati.

    Devi fermarti e studiare le parti TEORICHE del linguaggio o non ci sarà mai un codice funzionante. Se confondi chat con stringhe non siamo messi bene.
    Ok nulla ma guarda che non tutti i dati che ci sono li ho utilizzato...comunque scusa potresti farmi un esempio di collegamento tra liste e file...a me solo quello serve
  • Re: Liste in c

    Il motivo per cui non riesci a far funzionare il programma è che quella che chiami lista, non è una lista. Prima di fare programmi enormi e chiedere perché non funzionano, devi capire bene cos'è una lista, perché si usa e come funzionano.
    Il consiglio è mettere per un momento da parte tutto quel programma, studiarti le liste (anche la spiegazione, non solo guardare gli esempi), dopodiché privare ad implementare un semplice programmino con una lista di interi in cui inserisci, leggi e stampi gli elementi. Se avrai problemi, aprirai un thread in cui chiederai spiegazioni su quel codice. Quando avrai capito le liste tornerai sul programma con l'elenco dei libri.
    Se non hai la pazienza di fare questo, ti ritroverai a procedere alla cieca.
  • Re: Liste in c

    saraciao ha scritto:


    potresti farmi un esempio di collegamento tra liste e file...a me solo quello serve
    No a te serve studiare sui libri e tanto.

    Non ti serve copiare il mio codice anche perché ce ne sono tanti tantissimi su internet già pronti. Di gestione delle liste in C, di lettura dati da file in liste, di scrittura da lista in file ... c'è tutto su internet e se non l'hai ancora trovato è è perché non sapresti riconoscerli e modificarli per adattarli al tuo progetto.

    Non scriverò l'esercizio per te e nessun altro lo farà solo per poter presentare un progetto non tuo, che non hai capito ma che ti serve per superare l'esame. Non sono quattro righe e chi deve studiare sei tu. Un aiuto è una cosa, ma tu non hai bisogno di un aiuto ma di un mese di studio dell'abc.

    Leggi quello che ti ha scritto Alex ...
Devi accedere o registrarti per scrivere nel forum
14 risposte