If you find that you need to change a parameter which is a pointer in the body of a function, and that change should be reflected in the original pointer, you need to pass the parameter by reference or by a pointer to the type you want to change.
In other words, the prototype for add() should look like:
void add(node *& p,int sayi)
or
void add(node ** p,int sayi){
I would suggest the former, since the syntax within the function tends to be less confusing.
Does this code make sense to you? If data in the current node is greater than the data we're adding and left is NULL, replace the current node's data with the data to be added?
[Edit: Use code tags in the future, it makes your code much easier to read. Find the <> button.]