Liste semplici

di il
25 risposte

Liste semplici

Buongiorno ho un problema sull'inserimento in cosa...l'inserimento in coda mi funziona ma quando inserisco titolo autore e codice il codice viene aggiunto correttamente ma il titolo ed l'autore no..potete aiutarmi?

#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 libri* List;

typedef struct {
    struct libri elementi[100];
   int num_libri;
}Libro;

void ricerca (struct libri *l);
List initList(char titolo[30],char autore[30],int cod_id);
int menu(void);
struct libri *leggiFile(FILE *fp, struct libri *lista);
void scriviLista(struct libri *lista);
void scriviFile(FILE *fp, struct libri *lista);
struct libri *inserisciLista(struct libri *nodo, struct libri *lista);
struct libri *nuovoNodo(char *titolo,char *autore, int cod_id);
void gestioneErrore(void);
void freeLista(struct libri *lista);
void stampaLista(struct libri *top);
List insertTail(List L, char titolo, char autore ,int cod_id);
int main() {
    int scelta;
    FILE *fp;
    struct libri *lista=NULL;
    struct lista *top = NULL;
    int cod_id;
    char titolo = '\0';
    char autore;
    struct libri L;
    int presenza;
    Libro l;
    char nome;
    char cognome;
    char matricola;
   int id = 0;
    int n ;
    int trovato;

fp = fopen("Libri.txt","r");
if (fp == NULL) gestioneErrore();
lista = leggiFile(fp, lista);
fclose(fp);

while((scelta = menu())){
switch (scelta) /* Creo uno switch con 5 case, uno per ogni possibile scelta */
{
case 1: /*stampa lista*/
  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*/
        ricerca(lista);
        break;
case 3: /* Case costruito per restituire un libro tramite codice*/
           printf("Inserire titolo \n");
           scanf("%s", &titolo);
           printf("Inserire autore' \n");
           scanf("%s", &autore);
           printf("Inserire codice' \n");
           scanf("%d", &id);
        lista=insertTail(lista,titolo,autore,id);
        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;
}

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;
}

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);
}

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);
    }
}

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");
      }
   }
}

void ricerca (struct libri *l){
  int trovato = 0 ;
    char titolo[30];
    char nome;
    char matricola;
    char cognome;
    printf("\nInsersici il titolo del codice da cercare:");
    scanf("%s", &titolo);

while (l != NULL && trovato != 1) {
    if(strcmp(l->titolo, &titolo)==0) {
printf("\nIl libro cercato e' presente nell'archivio ed il libro e' disponibile");
        printf("\nInserisci nome: ");
        scanf("%s", &nome);
        printf("\nInserisci cognome: ");
        scanf("%s", &cognome);
        printf("\nInserisci matricola: ");
        scanf("%s", &matricola);
        printf("\nOperazione effettuata con successo\n");
        trovato=1;
   }
    l = l->next;
  }

    if(trovato != 1)
        printf("\nIl libro cercato non e' presente nell'archivio ed il libro non e' disponibile\n");
   }

List insertTail(List L, char titolo, char autore ,int cod_id) {
    if (L != NULL) {
        L->next = insertTail(L->next, titolo, autore, cod_id);
    }
    else{
        L = initList(titolo,autore,cod_id);
    }
    return L;
}

List initList(char titolo[30] ,char autore[30] ,int cod_id) {
    List L = (List)malloc(sizeof(struct libri));
    strcpy(L->titolo,&titolo);
    strcpy(L->autore,&autore);
    L->cod_id= cod_id;
    L->next = NULL;
    return L;
}

25 Risposte

  • Re: Liste semplici

    Non ti vorrei ripetere sempre le stesse cose ma ...

    Questa

    List insertTail(List L, char titolo, char autore, int cod_id) {

    ti pare corretta?
  • Re: Liste semplici

    oregon ha scritto:


    Non ti vorrei ripetere sempre le stesse cose ma ...

    Questa

    List insertTail(List L, char titolo, char autore, int cod_id) {

    ti pare corretta?
    List insertTail(List L, char titolo[30], char autore[30], int cod_id) {

    Ok così...
  • Re: Liste semplici

    Secondo te? Come hai scritto nella struttura?
  • Re: Liste semplici

    oregon ha scritto:


    Secondo te? Come hai scritto nella struttura?
    autore [30];
    titolo[30];
    il codice sopra l'ho aggiustato
  • Re: Liste semplici

    Quindi è autore[100] o autore[30] ? Deciditi
  • Re: Liste semplici

    oregon ha scritto:


    Quindi è autore[100] o autore[30] ? Deciditi
    autore[30]
    questa è la funzione
    
    List insertTail(List L, char titolo[50], char autore[20] ,int cod_id) {
        if (L != NULL) {
            L->next = insertTail(L->next, titolo, autore, cod_id);
        }
        else{
            L = initList(titolo,autore,cod_id);
        }
        return L;
    }
    
    ma mi stampa autore e titolo in codice
  • Re: Liste semplici

    E deve essere ovunque così sia una costante con una define al posto di 30
  • Re: Liste semplici

    oregon ha scritto:


    E deve essere ovunque così sia una costante con una define al posto di 30
    scusa non ho capito..
  • Re: Liste semplici

    Non c'è molto da capire ... 4ripeto usa una define per una costante al posto del numero 30 e usala dove ti serve
  • Re: Liste semplici

    oregon ha scritto:


    Non c'è molto da capire ... 4ripeto usa una define per una costante al posto del numero 30 e usala dove ti serve
    e cosa cambia?
  • Re: Liste semplici

    Il problema sta in InitLista, la strcmp dovrebbe essere
    
    strcpy(L->titolo,titolo); // non &titolo
    
    Nella funzione di stampa va usata la strcmp
    
    void stampaLista(struct libri *top)
    {
        if (top == NULL) {
            printf("\n--------------\n\n");
        }else
           if (strcmp(top->titolo, "")!=0) {
    printf("%s %s %d \n", top->titolo,  top->autore, &top->cod_id);
        stampaLista(top->next);
        }
    }
    
    Attenzione che, per come è fatta, se becca un libro senza titolo di ferma la stampa.
  • Re: Liste semplici

    Alexv ha scritto:


    Il problema sta in InitLista, la strcmp dovrebbe essere
    
    strcpy(L->titolo,titolo); // non &titolo
    
    Nella funzione di stampa va usata la strcmp
    
    void stampaLista(struct libri *top)
    {
        if (top == NULL) {
            printf("\n--------------\n\n");
        }else
           if (strcmp(top->titolo, "")!=0) {
    printf("%s %s %d \n", top->titolo,  top->autore, &top->cod_id);
        stampaLista(top->next);
        }
    }
    
    Attenzione che, per come è fatta, se becca un libro senza titolo di ferma la stampa.
    la stampalista era una funzione da eliminare....se tolgo & mi da errore quando compilo
  • Re: Liste semplici

    saraciao ha scritto:


    oregon ha scritto:


    Non c'è molto da capire ... 4ripeto usa una define per una costante al posto del numero 30 e usala dove ti serve
    e cosa cambia?

    Cambia che si programma così. In questo modo non usi 30 o 100 ma sempre una costante MAXCHAR

    Si può avere il codice corretto che UTILIZZI adesso?
  • Re: Liste semplici

    Ora però l'eliminazione non mi funziona
    
    struct libri *rimuoviLibri(struct libri *lista)
    {
      if (lista==NULL) return lista;
     if (ricerca == 1) {
      lista = rimuoviNodo(lista, lista);
       lista = rimuoviLibri(lista);
      } else lista->next = rimuoviLibri(lista->next);
      
      return lista;
    }
    
    
    static struct libri *rimuoviNodo(struct libri *lista, struct libri *nodo) {
      struct libri *tmp;
      
      if (lista == nodo) {
        tmp = lista->next;
        freeNodo(lista);
        return tmp;
      }
        else lista->next = rimuoviNodo(lista->next,nodo);
        return lista;
    }
    
    
    void freeLista(struct libri *lista)
    {
      if (lista != NULL) {
        freeLista(lista->next);
        freeNodo(lista);
      }
    }
    
    static void freeNodo(struct libri *nodo)
    {
      free((void *) nodo);
    }
    
    nel main ho scritto
    
    ricerca(lista
    lista = rimuoviLibri(lista,titolo);
    
Devi accedere o registrarti per scrivere nel forum
25 risposte