No sé muy bien cómo tenías planteado resolver el problema. Yo solo me voy a limitar a señalar el por qué te crashea el programa (segmentation fault). Este error se produce cuando intentas acceder a un área de la memoria que no está reservada para tu programa.
No sé el error exactamente pues no has puesto suficiente código, pero probablemente se esté produciendo porque no has inicializado correctamente la variable cabecera. En el constructor tendrías que haber hecho algo así:
Lista::Lista() {
cabecera = NULL;
}
Y en la función insertar, algo así:
void insertar(string cadena){
Celda *puntero;
puntero = cabecera;
if(NULL != puntero) { // Tienes que comprobar si hay datos o no
while(NULL != puntero->siguiente)
puntero = puntero->siguiente;
puntero->siguiente = new Celda;
puntero->siguiente->siguiente = NULL; // Tienes que inicializar
puntero->sigueinte->datos = cadena;
} else {
cabecera = new Celda;
cabecera->siguiente = NULL; // Tienes que inicializar
cabecera->datos = cadena;
}
}