Tienes algunas cosas mal en f_palindroma(el resto no lo he analizado mucho):
= no compara, asigna
2 bucles anidados? mirar si una palabra es palíndroma se hace en una pasada, o 2, pero no en n^2
comprobar si algo es palíndromo depende de que muchas comprobaciones se cumplan, no? tu sólo te quedas con la última(asignas a flag true o false, en vez de componer un resultado basado en todas las comparaciones)
y si ya tienes size para que chequeas fin de cadena('\0')? no hace falta
Otro consejo, ya lo comenté antes a otro, pero *(puntero+entero) == puntero[entero]
Solución:
Teniendo la longitud de la cadena es muy fácil, sólo tienes que comparar la mitad de la palabra, o sea, divides la palabra en 2 trozos y comparas el uno con el otro sólo que uno ascendente y el otro descendente.
for(p=cadena, q=cadena+size-1;p<=q;p++,q--)
if(*p != *q )
return 0;
return 1;
Básicamente es un flag = flag && *p == *q, lo que pasa que hago cortocircuito para acabar primero(en una conjunción con que uno sea falso anula toda la fórmula). Si te fijas un puntero va de principio a fin y el otro al revés
Creo que eso debería de funcionarte, o sino está muy cerca