Structuring code requires some experience, but mostly common sense.
For code separation, you usually read: conceptually consistent functions / data types should go in one file. As a good example, you can take the standard library. It is better to keep data definitions and descriptions in separate headers. This allows you to use data structures as part of the compilation module, even if you have not defined all the functions.
Files that provide similar functionality should be in the same directory. It is good to avoid a deep directory structure (preferably 1 level of depth), as this makes it difficult to create a project unnecessarily.
I think Make files are fine for small projects, but are cumbersome for larger ones. For really serious work (if you want to distribute your code, create an installer, etc.), you can look at cmake, scons, etc.
GNU: http://www.gnu.org/prep/standards/standards.html
gnu Makefile. Makefile. sourceforge.net.