No debes hacer
strcat(final
->caracteres
, t1
->caracteres
);
porque lo primero que hace la función es buscar el caracter '\0' de la cadena
final. Al no haberla inicializada a 0 esta contiene datos aleatorios y '\0' puede estar en cualquier sitio. Una vez que strcat encuentra este carácter nulo empezará a copiar t1 ahí.
Para solucionarlo cambia strcat por strcpy que copia desde el principio de la cadena.
Por otra parte: es de mala práctica esconder puntero detrás de un typedef. Mejor si dejas los punteros vistos.