Ti sto dicendo di fare un passo indietro e fare SOLO una funzione che ti dice se il valore passato come parametro è il quadrato di un intero oppure no.
Lascia stare il conteggio; costruisciti prima il "mattoncino".
Dopo che avrai scritto una funzione che fa questo lavoro, per es.:
IsQuadrato(4) => 1
IsQuadrato(3) => 0
IsQuadrato(49) => 1
scriverai una funzione che scorre tutta la tua struttura semplicemente stampando a video il valore corrente
while( p )
{
printf( "%d\n", p->inf );
...
}
Qui probabilmente ti accorgerai dell'errore che hai commesso...
Poi stamperai anche se il valore è o no un quadrato
while( p )
{
printf( "%d isquadrato=%d\n", p->inf, IsQuadrato(p->inf) );
...
}
e infine aggiungerai il conteggio che sarà a questo punto un gioco da ragazzi