In realtà è più scemplice ora, perchè per trovare un nodo ti basta scorrere il vettore dei nodi (di tipo elem).
Ti faccio un esempio di come puoi gestire la cosa, giusto come input di avvio:
codice:
#define N 27
int main ()
{
    elem *nodi;   
    int **mat;                                    // L' allocazione ti consiglio di farla nel main
    nodi=(elem*)malloc(N*sizeof(elem));
    mat=(int**)malloc(N*sizeof(int*));
    for(int i=0;i<N;i++)
        mat[i]=(int*)calloc(N,sizeof(int));
    // per creare un arco da i a j inizializzi mat[i][j] e mat[j][i] a 1
    // inizializzi il vettore dei nodi
    return 0;
}
Ora hai la matrice che ti dice le adiacenze (gli archi) tra i nodi.
Per trovare la lista di adiacenza del nodo i-esimo:
codice:
for(int j=0;j<N;j++)
{
    if(mat[i][j]==1)  // un nodo non dovrebbe mai essere adiacente a se stesso
    {                       // per cui se hai inizializzato bene la matrice, non si entra
                            // nell' if se i è uguale a j
        // nodi[j] è il nodo adiacente al nodo nodi[i]
    }
}
Siccome la matrice è simmetrica puoi scegliere se scorrere una riga o una colonna.
Inizia dalle cose semplici, nella dfs ora prova a trovare la lista di adiacenza di un nodo.