Estas liberando las estructuras de enteros , pero no los nodos de la lista, te falta hacer un "free(p);" dentro del bucle.
También tienes un "p->next;" que es una linea que no hace nada, tendría que ser "p= p->next;". Aun asi no bastaría con estos cambios, porque si liberas p, no puedes hacer un "p=p->next;" después, ya que "p" ya no existiría, tendrías que usar una variable extra para guardar el valor de "p->next" antes de liberar p.
Tampoco te haria falta usar una variable extra "i", ni la cantidad de elementos de la lista, ya que se puede recorrer la lista hasta que p->next sea igual a NULL. En realidad no se necesita guardar la cantidad de elementos de la lista en una variable, ya que la lista se puede manipular sin tener que usar ese valor.
Tampoco deberías usar typedefs para ocultar que estas usando punteros, porque así no se sabe si una variable o un parámetro de una función se corresponde con un puntero o no, lo que hace que sea mas fácil de cometer errores, como por ejemplo dejar memoria sin liberar.
El código es mas difícil de entender de lo que debería, debido al uso de typedefs y los nombres que estas eligiendo para las variables y estructuras.
PD: Deberías poner el código entre las etiquetas correspondientes para que salga algo así:
/* ejemplo codigo */
Al no usar las etiquetas el código que has puesto sale modificado, por ejemplo lo que hay entre corchetes desaparece y da la impresión de que hay errores en algunas líneas (estoy suponiendo que no los hay y que algunos corchetes que faltan sí estan en el código original).