[Pertaining to your Question-code]
Assume tree:
   A
  / \
 B   C
It's In-order traversal = B,A,C
Now consider, B was already printed by 
if(current->left == NULL)
    {
      printf(" %d ", current->data);
      current = current->right;
    }
So, The Condition:
pre->right != current
is required to break while loop (which may be cyclic at times), exactly when our aim is to print node A.

In this case, at the end of the while loop i.e. while(pre->right != NULL && pre->right != current), we'll have :
1) pre pointing to left node B - which is already printed 
2) current pointing to middle node A - Next to be print, thus breaking cycle link we've created just for this. Following part takes care of this:
else
      {
        pre->right = NULL;           // Break cyclic link we've created for printing 'A'
        printf(" %d ",current->data);// prints 'A'
        current = current->right;    // Now, Aim for 'C'
      }