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?