OK, ignore my last two posts. I guess I'm still just a beginner and didn't know how the parameter passing worked. I thought passing *&nodePtr meant passing a pointer to the address of your nodePtr, which didn't make sense to me. Instead, it means passing the address (ie reference) of nodePtr, which does make sense. I couldn't get insertion to work because I changed it.
Now for your current problem, I'm not sure what's wrong. I can compile and run what you have right now without any problems. Maybe it has to do with the data you're inputting and your deletion functions. Suppose that you input F, H, G, I, J in that order.
The root node is F, F's right child is H, H's left child is G and right child is I, I's right child is J. So your tree looks like this:
Let's say that F, H and G are addresses that end in ".net" but the others don't. When you call displayNet(), it first checks for the left children of F. There is none, so now it goes and checks F. F ends it ".net" so it goes right ahead and deletes F, and now the nodePtr is at H. Since the function has already checked for the left child of nodePtr and nodePtr itself, now it checks nodePtr's right children. In other words, it skips checking H and G.
EDIT: You also have to be careful when calling
void deleteNet(emailTree *&nodePtr, string email)
. If email doesn't exist in your tree, that would lead to an infinite loop.