Ricordare che la ricorsione non prevede cicli per stabilire il punto d'uscita, ma solo if.
Nella tua funzione hai inserito un ciclo while di troppo che interferisce col meccanismo di ricorsione.
codice:
void ricerca ( listPtr headR )
{
if (headR == NULL) return;
ricerca ( headR->next);
fprintf (stdout , "%s\n" , headR->value ) ;
}
Non l'ho testata, ma dovrebbe essere giusta. Quando headR varrà NULL hai raggiunto la condizione di uscita, ricerca esce e stampa il valore corrispondente.
Se headR non è NULL, la funzione esegue le prime due linee di codice e richiama se stessa fino al raggiungimento della condizione.