The way I implemented my MUD was to have basically a list of a bunch of "rooms", classes with a title, long description, etc, with exits stored as a number. Each room had an assigned number that I used to refer to it.
Players internally had a number that determined the room they were located in, and attempts to move checked their current rooms exits.
I had a main thread that would loop through all players logged into the game and would execute one command string off their command queue. There were separate threads for each player that read in input from their socket and placed it into the command queue.
This isn't to say this is the best way of doing it, but I had this system work for my testing purposes.