I see a couple of conspicuous issues. First, the code increments wordcount for every character read in, not every word. That's going to throw your word count way off.
Second, when you malloc new nodes, you don't initialize the is_word element of the node. This means that it contains garbage data that could be interpreted as true or false. is_word really needs to be initialized as false whenever a node is created.
Of course, there's no way to tell what, if anything, might be wrong with check(). This should get you going a little.
There are problems in both load() and check(). Let's start with check().
In check, you have a catchall return statement at the end -
return true;. When a function is validating something, as this one does, it should ONLY return TRUE when the test conditions have been verified as met. This catchall return should be FALSE, not true.
Next, the code is checking for the end of the word by looking for the end of string marker,
\0. It never gets there. The for loop is limited at strlen(word). Unfortunately, the strlen() function does not include the EOS marker, only the characters leading up to it. You are stopping the loop one char too early, so it never actually finds a word.
Moving on to loop(). There are problems here too. First, it doesn't handle the last word correctly. Since there is no '\n' after the last word, it never gets to a point where it can mark the end of the word and increment the word count.
Now is where it gets fun. There are other problems that I've not been able to isolate. For instance, after processing a dictionary with two words, I can walk the trie and find 27 end of word markers, the first word doesn't appear to be marked as a word, etc.
This should at least get you going again. I'll leave it to you to debug load() and find the root causes.
If this answers your question, please click on the check mark to accept. Let's keep up on forum maintenance. ;-)