Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20

Discussione: [C] liste

  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    152

    [C] liste

    salve ho un problemino con le liste

    ho implementato due progetti uno per capire come funzionano le liste e un altro un pò piu complicato per vedere se avevo capito il concetto

    il primo lavoro (funzionante testato) è il seguente
    codice:
    #include <stdio.h>
    
    struct elemento{
           int info;
           struct elemento *next;
           };
           
    struct elemento *crealista(){
           char c;
           struct elemento *p;
           printf("Vuoi inserire degli elementi? \n");
           scanf("%c" , &c);
           if(c == 'n'){
               p=NULL;
                }
           else if(c == 's'){
                while(c == 's'){
                p=(struct elemento*)malloc(sizeof(struct elemento));
                printf(" inserisci elemento : ");
                scanf("%d" , & p->info);
                scanf("%c", &c);
                if( c == 'n' )
                p->next=NULL;
                else
                p->next=crealista();
                }
                }
                return (p);
                }
                
    void visualizza(struct elemento *p){
         printf( " Lista --> ");
         while(p!= NULL){
                   printf("%d", p->info);
                   printf("-->");
                   p=p->next;
                   }
                   printf(" fine \n ");
                   }
    
    
    main(){
           struct elemento *e;
           e= crealista();
           visualizza(e);
           system("PAUSE");
           }

    per il secondo lavoro ho utilizzato lo stesso algoritmo cioè quello di aggiungere un elemento ogni volta si preme 's'

    codice:
    #include <stdio.h>
    
    struct login{
           int giorno;
           int mese;
           int anno;
           };
           
           
    struct logout{
           int giorno;
           int mese;
           int anno;
           };
           
           
    struct ospite{
           char nome[500];
           int stanza;
           struct login checkin;
           struct logout checkout;
           struct ospite *next;
           };
           
    
         
    
           
    struct ospite *crealista(){
           struct ospite *p;
           char nome[50];
           char c;
           int stanza;
           printf("premi s per iniziare \n");
           scanf("%c", &c);
           printf("crea ospite \n");
           
           if( c == 'n'){
               p=NULL;
               }
           else if( c == 's' ){
                while(c == 's'){
                p=(struct ospite*)malloc(sizeof(struct ospite));
                printf(" Nome e cognome : ");
                scanf("%s",  nome);
                strcpy( p->nome , nome);
                printf( " numero di stanza : ");
                scanf("%d",& p->stanza);
                printf(" data di entrata : \n");
                printf("giorno :");
                scanf("%d", & p->checkin.giorno);                  
                printf("\n mese : ");
                scanf("%d", & p->checkin.mese);
                printf("\n anno : ");        
                scanf("%d", & p->checkin.anno); 
                printf(" data del logout ? \n");
                printf("giorno :");
                scanf("%d", & p->checkout.giorno);                  
                printf("\n mese : ");
                scanf("%d", & p->checkout.mese);
                printf("\n anno : "); 
                scanf("%d ", &p->checkout.anno);
                scanf("%c", &c);
                if(c == 's')
                p->next=crealista();
                if( c== 'n')
                p->next=NULL;
                }
                }
                return(p);
                }
               
    
    
    
    
           void visualizza( struct ospite *p){
         printf( "Ospite --> ");
         while( p != NULL ){
                printf("%s", p->nome);
                printf("-->");
                printf("%d", p->stanza);
                printf("-->");
                printf("%d",p->checkin.giorno);
                printf("-->");
                printf("%d",p->checkin.mese);
                printf("-->");
                printf("%d", p->checkin.anno);
                printf("-->");
                printf("%d", p->checkout.giorno);
                printf("-->");
                printf("%d", p->checkout.mese);
                printf("-->");
                printf("%d", p->checkout.anno);
                printf("-->");
                p=p->next;
                }
                printf("\n\n NULL ");
                }
                
    main(){
        struct ospite *o; 
        o=crealista();
        visualizza(o);
        system("PAUSE");
           }

    qualcuno sa spiegarmi perchè i due programmi si comportano diversamente?

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,479

    Moderazione

    Originariamente inviato da keykode20
    qualcuno sa spiegarmi perchè i due programmi si comportano diversamente?
    Spiega già tu dove sta la diversità di comportamento che noti, senza costringere gli utenti a prendere il tuo codice e compilarlo per verificarne gli effetti.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Dovrebbe essere il solito problema causato dall'input bufferizzato delle varie scanf.

    Se usi un compilatore Microsoft, inserisci un fflush(stdin) in

    codice:
        printf("premi s per iniziare \n");
        fflush(stdin);
        scanf("%c", &c);
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    152
    ok allora la il primo compilato ed eseguito fa la seguenete cosA:

    "vuoi aggiugnere eleneto?" se premi s: -> "inserisci elemento"-> una volta inserisci elemento torna la scritta "vuoi aggiungere elemento?" premendo n stampa tutta la lista


    il secondo invece, dopo aver richiesto tutti i campi da input, non mi fa apparire la scritta "vuoi aggiungere un altro ospite" e mi chiedevo come fosse possibile poichè sono esattamente lo stesso codice solo con una struttura con qualche campo in piu! e quando arrivo alla stampa mi fa stampare solo l ultimo "ospite" inserito!

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Originariamente inviato da keykode20
    non mi fa apparire la scritta "vuoi aggiungere un altro ospite"
    E dove sarebbe questa scritta nel codice??

    P.S. Non hai letto la mia risposta precedente.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    152
    hai ragione manco mezzo commento ho scritto
    allora :
    codice:
    struct elemento *crealista(){
           char c;
           struct elemento *p;
           printf("Vuoi inserire degli elementi? \n");
           scanf("%c" , &c);                                //prima interrogazione da parte dell input avvia il programma se premi 's'
           if(c == 'n'){
               p=NULL;
                }
           else if(c == 's'){
                while(c == 's'){                           //se premi 's' fino a che non cambi il valore di c ( = 's')
                p=(struct elemento*)malloc(sizeof(struct elemento));              //fai posto
                printf(" inserisci elemento : ");
             *   scanf("%d" , & p->info);                                           //inserisci informazini
             *     scanf("%c", &c);                                                       // leggi da input un nuovo valore per chiedere se si vuole continuare o meno
                if( c == 'n' )
                p->next=NULL;
                else
                p->next=crealista();
                }
                }
                return (p);
                }
    nell altro codice quando vado ad eseguire, inserisco i campi, e quello che accade è che, dopo aver inserito l ultimo campo, il programma non torna ricorsivamente come fa questo! in parole povere (*) scanf("%d", & p->info); inserisce un elemento subito dopo aver inserito "info" questo torna all inizio del programma chiedendomi se voglio aggiungere un altro elemento

    il secondo codice, da cui ho preso la stessa struttura, all inserimento dell' ultimo dato non mi torna all inizio del programma come fa questo...

    [CODE]
    struct ospite *crealista(){
    struct ospite *p;
    char nome[50];
    char c;
    int stanza;
    printf("premi s per iniziare \n");
    scanf("%c", &c);
    printf("crea ospite \n");

    if( c == 'n'){
    p=NULL;
    }
    else if( c == 's' ){
    while(c == 's'){
    p=(struct ospite*)malloc(sizeof(struct ospite));
    printf(" Nome e cognome : ");
    scanf("%s", nome);
    strcpy( p->nome , nome);
    printf( " numero di stanza : ");
    scanf("%d",& p->stanza);
    printf(" data di entrata : \n");
    printf("giorno :");
    scanf("%d", & p->checkin.giorno);
    printf("\n mese : ");
    scanf("%d", & p->checkin.mese);
    printf("\n anno : ");
    scanf("%d", & p->checkin.anno);
    printf(" data del logout ? \n");
    printf("giorno :");
    scanf("%d", & p->checkout.giorno);
    printf("\n mese : ");
    scanf("%d", & p->checkout.mese);
    printf("\n anno : ");
    scanf("%d ", &p->checkout.anno);
    scanf("%c", &c);
    if(c == 's')
    p->next=crealista();
    if( c== 'n')
    p->next=NULL;
    }
    }
    return(p);
    }
    [/CODE ]

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Originariamente inviato da oregon
    E dove sarebbe questa scritta nel codice??
    Intendo dire che la frase

    "vuoi aggiungere un altro ospite"

    del secondo codice che dici non appare, in realtà non c'è nel codice !

    P.S. Non hai letto la mia risposta precedente.
    Mi sembra che tu non abbia ancora letto il mio commento sulla funzione fflush ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    152
    ah si mi sono sbagliato dovrebbe stampare "premi s per iniziare", anche con la funzione fflush succede la stessa cosa

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Originariamente inviato da keykode20
    anche con la funzione fflush succede la stessa cosa
    Avresti potuto dirlo un po' di post fa ...

    Mi mostri come hai modificato il codice con la fflush e qual è TUTTO il codice attuale?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    152
    codice:
    #include <stdio.h>
    
    struct login{
           int giorno;
           int mese;
           int anno;
           };
           
           
    struct logout{
           int giorno;
           int mese;
           int anno;
           };
           
           
    struct ospite{
           char nome[500];
           int stanza;
           struct login checkin;
           struct logout checkout;
           struct ospite *next;
           };
           
    
         
    
           
    struct ospite *crealista(){
           struct ospite *p;
           char nome[50];
           char c;
           int stanza;
           printf("premi s per iniziare \n");
           fflush(stdin);
           scanf("%c", &c);
           printf("crea ospite \n");
           
           if( c == 'n'){
               p=NULL;
               }
           else if( c == 's' ){
                while(c == 's'){
                p=(struct ospite*)malloc(sizeof(struct ospite));
                printf(" Nome e cognome : ");
                scanf("%s",  nome);
                strcpy( p->nome , nome);
                printf( " numero di stanza : ");
                scanf("%d",& p->stanza);
                printf(" data di entrata : \n");
                printf("giorno :");
                scanf("%d", & p->checkin.giorno);                  
                printf("\n mese : ");
                scanf("%d", & p->checkin.mese);
                printf("\n anno : ");        
                scanf("%d", & p->checkin.anno); 
                printf(" data del logout ? \n");
                printf("giorno :");
                scanf("%d", & p->checkout.giorno);                  
                printf("\n mese : ");
                scanf("%d", & p->checkout.mese);
                printf("\n anno : "); 
                scanf("%d ", &p->checkout.anno);
                scanf("%c", &c);
                if(c == 's')
                p->next=crealista();
                if( c== 'n')
                p->next=NULL;
                }
                }
                return(p);
                }
               
    
    
    
    
           void visualizza( struct ospite *p){
         printf( "Ospite --> ");
         while( p != NULL ){
                printf("%s", p->nome);
                printf("-->");
                printf("%d", p->stanza);
                printf("-->");
                printf("%d",p->checkin.giorno);
                printf("-->");
                printf("%d",p->checkin.mese);
                printf("-->");
                printf("%d", p->checkin.anno);
                printf("-->");
                printf("%d", p->checkout.giorno);
                printf("-->");
                printf("%d", p->checkout.mese);
                printf("-->");
                printf("%d", p->checkout.anno);
                printf("-->");
                p=p->next;
                }
                printf("\n\n NULL ");
                }
                
    main(){
        struct ospite *o; 
        o=crealista();
        visualizza(o);
        system("PAUSE");
           }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.