Secondo me, in:

codice:
do{
printf("\n\t %d",app->info);
app=app->p;
}while(app->p!=app);
La condizione del while mi lascia dubbioso....
Cioè tu hai una cosa del tipo:

[1]--->[2]--->[3] dove 1 punta a 2, 2 punta a 3 e tre punta a 1 giusto? Ma tra di loro sono diversi no?