Hai fatto bene a postare l' input del terminale, così è chiaro.
Innanzitutto con la realloc,siccome ritorna un puntatore a void, anche se il tipo Data* è compatibile col tipo void*,è sempre meglio effettuare un cast a Data*.
Poi tu passi come parametro Vett, che è un puntatore.
Ma il puntatore originario rimane intatto: infatti se provi a stampare dopo la chiamata a input_tutti il valore di Vett, è sempre NULL.
La input_tutti, come una qualsiasi altra funzione, fa solo una copia di quel puntatore.
Per cui alla fine della funzione avrai perso il riferimento a quella memoria.
Altra cosa: chiami la realloc senza che ci sia stata allocata memoria.Quando i=1 chiama la malloc.
Inoltre è meglio controllare che la malloc e la realloc non ritornino NULL.
Puoi usare le asserzioni di assert.h , o exit(int).
Ecco il codice corretto:
codice:
int input_tutti( Data** V, int* nE ) {
	int i = *nE;
	int ctrl = 0;
	while( ctrl != 1 ) {
	    i++;
	    if(i>1)
		    *V = (Data*)realloc( *V, i*sizeof(Data) );
            else
                    *V=(Data*)malloc(sizeof(Data));
            assert(*V!=NULL);  
	    (*V)[i-1] = input_singolo();
	    printf( "Immettere 1 per fermare l'inserimento, immettere 0 per continuare: " );
	    scanf( "%d", &ctrl );
	    }
	*nE = i;
	return ctrl;
}