Есть много проблем с этим фрагментом кода. Во-первых, определение структуры должно знать, сколько памяти выделить, и не может этого сделать, если оно содержит тип, который не был полностью определен (вот почему люди рекомендуют использовать указатель, поскольку размер указателя равен известно во время компиляции).
Однако, и это важно, простое изменение указателей не решит проблему, поскольку первая комната * встречается до того, как соответствующий typedef завершится. Вам нужно написать что-то вроде:
struct rooms {
int n_monsters;
int visited;
struct rooms *nentry;
struct rooms *sentry;
struct rooms *wentry;
struct rooms *eentry;
monster *monsters;
} rooms;
или выполнить предварительное объявление (typedef struct rooms rooms;). Вам также необходимо убедиться, что тип монстра определен или хотя бы имеет предварительное объявление.