Aver, no soy un experto sobre el C, pero creo que ya se cual es el problema...
En tu función de "agregar", no ví que hagas uso de la instrucción "new", que es justamente lo que caracteriza el uso de memoria dinámica en C.
Por lo que veo en tu función agregar, simplemente declaras un puntero LOCAL de la función.En ningún momento "solicitas" memoria "nueva"...
Me parece que la función agregar debería ser así
Mientras estaba escribiendo mi respuesta, el se había auto-respondido...En el primer código que paso no uso malloc...Gracias por las correcciones!!!!