Così non stampi nulla.
codice:
if ((tmp->composizione[i] == 'A' || tmp->composizione[i] == 'U'))
tmp->composizione[i]='\0';
Il primo carattere che entra nella condizione fa terminare la stringa.
Nel tuo caso AIUSPAUU diventerebbe \0IUSPAUU e la printf stamperebbe una riga vuota
IUSPAUU diventerebbe I\0SPAUU e la printf stamperebbe I
Devi usare una stringa di appoggio.
codice:
char result[40];
char *p = result;
if ((tmp->composizione[i] == 'A' || tmp->composizione[i] == 'U')) {
*p++ = tmp->composizione[i];
}
/* dopo il for */
*p = '\0';
printf(">%s\n", result );