c'erano degli errori, ho corretto e provato, così funziona.
codice:
#include <cstdlib>
#include <iostream>
#include <fstream>
#define MAXLEN 100  //lunghezza massima delle stringhe di nomi,cognimi,domini.
using namespace std;
struct chunk
{
   chunk()
   {
      data = NULL;
      next = NULL;
   }
   char* data;
   chunk* next;
};
struct list //struttura per le liste di valori per campo
{
       list() //inizializza la lista
       {
          first = NULL;
          count = 0;
       }
       chunk* first;
       chunk* last;
       int count; //numero di valori nella lista
       char* FindString(int ID) //trova il valore con id ID
       {
		     if(ID == 0) return(first->data);
             int i = 0;
             chunk* c = first;
             while(i < ID) {c = c->next; i++;}
             return(c->data);
       }
       void AddValue(char* value)
       {
            chunk* c = new chunk;
			c->data = new char[strlen(value)+1];
            memcpy(c->data,value,strlen(value)+1);
            if(count == 0){
				first = c;
				last = first;
			}
            else {last->next = c; last = last->next;}
            count++;
       }
};
list* CreaListaDaFile(char* fname)
{
      list* lista = new list();
	  ifstream fin(fname);
	  char buffer[MAXLEN];
	  fin.getline(buffer,MAXLEN);
	  if(strlen(buffer)>0) lista->AddValue(buffer);
	  while(!fin.eof())
	  {
		  fin.getline(buffer,MAXLEN);
		  lista->AddValue(buffer);
	  }
	  fin.close();
	  return(lista);
}


int main(int argc, char *argv[])
{
    list* nomi = CreaListaDaFile("C:/nomi.txt");
    list* cognomi = CreaListaDaFile("C:/cognomi.txt");
    list* domini = CreaListaDaFile("C:/domini.txt");
    //nomi.cognomi.domini
    int campi[3]; //creo 3 campi, ognuno è un numero che va da 0 all'indice dell'ultimo valore della sua lista (==sua_lista.count-1, se diamo al primo indice 0)
    campi[0] = 0;
    campi[1] = 0;
    campi[2] = 0; //ho messo l'indice di ogni campo al primo della loro lista.
    //campo0 è quello più a sinistra, poi viene 1 e 2.
    while(true)
    { //finchè il campo più a sinistra non ha raggiunto il fondo della sua lista
      cout << nomi->FindString(campi[0]) << "." << cognomi->FindString(campi[1]) << "@" << domini->FindString(campi[2]) << endl;
      campi[2]++;
      if(campi[2] == domini->count)
      {
         campi[2] = 0;
         campi[1]++;
         if(campi[1] == cognomi->count)
         {
             campi[1] = 0;
             campi[0]++;
             if(campi[0] == nomi->count)
             {
                 break;
             }
         }
      }
    }
    system("PAUSE");
    return EXIT_SUCCESS;
}