В C. нет такой вещи, как "передача по ссылке". Если вам нужно присвоить новое значение указателю, переданному в функцию (а не просто изменить то, на что указывает указатель), вы будете делать это. нужно передать указатель на указатель, т. е.
void insertNode(int data, node **q, node *parent){
/* code */
*q = p;
}
Когда вы передаете указатель (или что-то еще) в C, вы передаете копию указателя. Итак, этот тип изменения виден для вызывающих абонентов вашей функции:
q->someVal = someOtherVal;
но это не потому, что вы изменяете только копию, переданную функции:
q = p;
Вам нужно добавить еще один уровень косвенности, чтобы изменить сам аргумент так, чтобы это изменение было видно за пределами функции.