No, it's not. However, they exist for convenience and to help deal with larger projects so code wouldn't need to be copied over and over.
You can include header files provided by others, e.g. <stdio.h> for standard input/output operations, and you can also make your own header files if you want to share types across multiple files or you'd like to offer functionality for 3rd parties (e.g. you're creating an API).
It is highly recommended to create header files for anything more than a single file project.
Update
I've seen some people saying you need stdio.h or other headers. This is not true. They exist for your convenience, but you do not absolutely need to use them. You can just pick the function declarations from those headers that you would actually use in your code. They work because the header file contains just the declarations, but the definitions live somewhere else and they will be linked against your compiled project automatically (at least the standard library functions).
Here's an illustration below. Enjoy!
extern int printf(const char * format, ...);
extern int scanf(const char * format, ...);
int main()
{
printf("Did you know you do not absoutely need to include stdio.h?\n");
scanf("%*s");
printf("Isn't this amazing?!");
return 0;
}