Te lo dije en el post anterior y eferion te lo explicó con mas detalle.
Código:
void imprimir()
{
elemento *q;
char d;
if(q!=nullptr){
while(q!=nullptr){
cout<<"\n solo imprimo";
cout<<"\n : "<<q->dato;
q=q->sig;
}
}
else{
cout<<"\n Vacia";
}
}
*q es un puntero vacio. No esta apuntando a nada. Es mas, ni siquiera tiene nullptr.
No hay nada en esa funcion que vincule tus demas estructuras con la misma funcion.
Haz diagramas de tus punteros, eso ayuda a entender bien que esta sucediendo.
PD: Por cierto. No es una buena practica mezclar NULL y nullptr. O usas uno o el otro, pero no ambos. NULL es pre C++11. nullptr es una mejora de C++11.