This implementation is different from the one in the book. Each node in this tree should be represented as a struct that captures the status of the board as an array. The children of a node will represent the results of alternative moves. So, for example, the root will have 9 children. Each child represents the result of a different choice made by the user.
Nothing fancy is required here.
The user will always make the first move so, initially, this display should be all E's. You may get fancier, if you wish, but this is all that is required as a board display. Your program should request a move from the user and accept what is entered. Based on what the user sees, she will enter a number. If the user types an illegal move, your program should so inform her and ask for another move.