Проблема в том, что вы не назначаете возвращенное значение функции insert для корня узла.
Запись
root = insert (root, 2);
// ...
Другая проблема состоит в том, что вы неправильно распределяете память
temp = (struct node *) malloc (sizeof (struct node *));
^^^^^^^^^^^^^
Должно быть
temp = (struct node *) malloc (sizeof (struct node ));
^^^^^^^^^^^^^
Также внутри функции вставьте внутренний, еслиоператор должен выглядеть следующим образом:
if (x < root->data)
{
root->left = insert (root->left, x);
}
else
{
root->right = insert (root->right, x);
}
Обратите внимание, что согласно стандарту C функция main без параметров должна быть объявлена как
int main( void )