LISTE

di il
8 risposte

LISTE

.

8 Risposte

  • Re: LISTE

    Con i puntatori scrivi un po' più codice ma è una soluzione migliore in quanto ti consente di utilizzare meglio la memoria e non avere limitazioni (se non quelle del sistema).

    Nell'altro caso eviti la gestione dell'allocazione/deallocazione della memoria (e il codice è più semplice) ma sprechi memoria e sei limitato dal massimo assegnato.

    Decici tu ...
  • Re: LISTE

    Seguendo la soluzione con i puntatori ho gestito la cosa nel modo seguente:
    
    struct libro{
           char *autore;
           char *titolo;
           char *editore;
           int anno;
           int copie;
           struct libro *next;
    };
    
    /*Inserimento di un libro nella lista*/
    int inserisci(){
        struct libro *l, *prev, *cur;
        char a[DIM], t[DIM], e[DIM];
        
        l=malloc(sizeof(struct libro));
        if(l==NULL){
                    printf("la biblioetca è piena\n");
                    return 0;
        }
        printf("inserisci autore: ");
        fgets(a, sizeof(a) ,stdin);
        l->autore=malloc((strlen(a)+1)*sizeof(char));  
        strcpy(l->autore,a);  
        printf("inserisci titolo: ");
        fgets(t, sizeof(t), stdin);
        l->titolo=malloc((strlen(t)+1)*sizeof(char));
        strcpy(l->titolo,t);
        
        for (cur = biblioteca, prev = NULL; 
            cur!=NULL && (strcmp(cur->autore,a)!=0 || strcmp(cur->titolo,t)!=0);
                  prev=cur, cur=cur->next)
                  ;
        if(cur!=NULL){
                printf("il libro e' gia' stato registrato\n"); 
                      return 0;         
        }
        
        printf("inserisci editore: ");
        fgets(e, sizeof(e), stdin);
        l->editore=malloc((strlen(a)+1)*sizeof(char));
        strcpy(l->editore,e);
        printf("insersci anno: ");
        scanf("%d",&l->anno);
        fflush(stdin);
        printf("inserisci copie: ");
        scanf("%d",&l->copie);
        fflush(stdin);
        l->next=cur;
        if(prev==NULL){
                       biblioteca=l;
        }
        else 
             prev->next=l;
        return 1;
    }
    
    Sono corretti questi passaggi?
  • Re: LISTE

    In realta' ne l'una ne l'altra.

    Meglio sarebbe usare le STL. Quindi avresti:

    struct libro{
    std::string autore;
    std::string titolo;
    std::string editore;
    int anno;
    int copie;
    };

    std::vector<libro>

    oppure

    std::list<libro>

    Perche'?

    1) l'uso di std:string ti risolve il problema di avere una lunghezza massima nella stringa, o di dover gestire l'allocazione degli array di caratteri (con tutto cio' che ne segue)
    2) l'uso di std::vector (o di std::list) ti risolve il problema di gestire l'allocazione dei singoli nodi della lista (con tutto cio' che ne consegue), oltre al fatto che le STL ti mettono a disposizione un sacco di altre funzionalita'
    3) assegni all'oggetto libro la responsabilita' della memoria che gli serve per mantenere le informazioni.

    Consiglio: stuida STL e BOOST

  • Re: LISTE

    E' vero che può utilizzare altro, ma se la domanda è tra due opzioni (e non su cosa sia meglio in assoluto) si presuppone che sia una scelta limitata da vincoli didattici ...

    Ma potrei sbagliarmi ...

    (a questo punto perché gestire una lista e non ricorrere agli specifici oggetti di STL ?)
  • Re: LISTE

    Sì, la mia è una scelta limitata da vincoli didattici!
  • Re: LISTE

    Beh, allora la scelta e' ovvia:

    quale delle due strutture dati ti permette di scrivere meno codice (sempre ed assolutamente una buona cosa), ti permette di non diventare matto nella gestione della memoria/buffer da allocare/deallocare?
  • Re: LISTE

    Mi è stata fornita la soluzione con i puntatori, con relativa funzione d'inserimento nodi...a questo punto mi interessa solo sapere se la funzione per inserire un nuovo libro nella lista risulta corretta:
  • Re: LISTE

    "Ti è stata fornita" la soluzione? Chiedi a chi te l'ha fornita se è corretta, no ?
Devi accedere o registrarti per scrivere nel forum
8 risposte