Проблема в сигнатуре метода add, чтобы ваша программа работала, вы должны передать указатель на указатель NODE, как это
void add(NODE **,int );
и работать с ним.
Тогда в случае
if(*q==NULL)
Вы можете выделить память и заменить NULL-указатель на новую HEAD
этим
*q=(NODE*)malloc(sizeof(struct node));
Так оно и будет работать.
Проблема в том, что когда вы выделяете память, вы просто заменяете локальную копию нулевого указателя на NODE, но это не влияет на заголовок в основной функции.