Hola.
Debes hacer una función recursiva, ya que es la forma más simple de recorrer el árbol de directorios. Utiliza las funciones findfirst() y findnext(). Si el archivo que encuentra es un directorio, vuelves a llamar a la función pasándole el nombre del directorio al que vas a entrar. Por ejemplo:
tree(char *ruta)
{
static int nivel = 1;
if ( chdir(ruta) )
return;
if ( findfirst(...) )
return;
nivel++;
do {
imprime_nombre_fichero
si es directorio y no es "." ni ".."
tree(nombre);
} while( !findnext(...) );
nivel--;
if (nivel > 1)
chdir("..");
}
De esta forma, vas entrando en los directorios y mostrando su contenido. Con la variable nivel, sabes en qué subnivel te encuentras, y si tienes que volver al directorio anterior.
Es sólo una idea, pero puede ser un comienzo.
Un saludo.