You insert numbers 1 - 10. the 0 comes from your Initialize() function, it create a node with the value 0. Then your insert function doesn't preserve the order of the 0.
list = 0 after initialization
list = 0,1 after insert of 1
list = 0,2,1 after insert of 2
list = 0, 10,9,8,7,6,5,4,3,2,1 after insert of 10
Now your traversal is actually printing your list in reverse and your reverse_traveral is also printing in reverse but only because you didn't call it recursively, you call the regular traverse instead. If you call it recursively, it will print the list forward.
Ahh 1 more problem in reverse_traverse: if( L->next == 0 ) return; This return causes the last node not to print it's data, so once you fix your reverse_traverse, you will see it leaves off the 1 at the end
ok just found something else. In your remove function you do delete Tmp;
delete is for deleting arrays not single pointers and it's behavior is undefined. Use just delete tmp;
ok, this is last edit: in your insert function you have a check if the list is null and if so you create the first node. You set the next value to the temp you create but you leave the data member uninitialized. Therefore you 1st node data will be garbage.
I lied, this is last edit. Your find function won't find the last node because you are checking ->next == NULL. So even though there is a value in this node, ->next==NULL will be true and cause your search to end without finding the value. if you switch your or statement around, and check for the node == NULL on the left side of the || it will short circuit the statement preventing your other check from being evaluted using a null pointer.