One data structure you could use is a simple binary tree that contains words you could compare using strcmp. (I will ignore case issues for now).
You will need to ensure the tree remains balanced as you grow it. For this look up AVL trees or 1-2 trees or red-black trees on wikipedia or elsewhere.
I will not give too much more detail except that to create a binary tree struct, each node would have a left and right sub-node which could be null, and for a leaf node, both sub-nodes are null. To make it simpler use an "intrusive" node that has the value and two sub-nodes. Something like:
struct Node
{
char * value;
size_t frequency;
struct Node * left;
struct Node * right;
};
and obviously being C you need to do all the memory management.
You will have a function that recurses down the tree, comparing and going left or right as appropriate. If found it will just up the frequency. If not your function should be able to determine the place at which to insert the node, and then comes your insertion and rebalancing logic. Of course the new node will contain the word with a frequency of 1.
At the end you will need a way to recurse through your tree printing the results. In your case this can be a recursive function.
Note by the way that an alternative data structure would be some kind of hash-table.
If you are looking for the most efficient solution and have a lot of memory at hand, you would use a data structure whereby you branch through each letter as you encounter it. So the "a" gives you all the words beginning with a, then move to the second letter which is the "b" etc. It is rather complicated to implement for someone who doesn't know data structures so I would advise you to go with the simple binary tree.
Note that in printing out, it would not be in reverse order of frequency so you would have to sort the results first. (In C++ using map you also would not get them in that order).