You can use the -delete flag of find (first test with -ls)
find -not -name "*.c" -delete
If you do not want to use find, but only files in the current directory, you could do
rm !(*.c)
Make sure in bash that with shopt -s extglob the correct globbing is set. Additionally, if you have globstar set (shopt -s globstar), you can act recursively (for bash versions above 4):
rm **/!(*.c)