Secondo me, in:
La condizione del while mi lascia dubbioso....codice:do{ printf("\n\t %d",app->info); app=app->p; }while(app->p!=app);
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?