Я считаю, что ваши заголовочные файлы не защищены включенными защитными устройствами для предотвращения переопределений.Они должны быть
//header.h
#ifndef SOME_LONG_UNIQUE_NAME
#define SOME_LONG_UNIQUE_NAME
//header contents here
#endif
Как примечание: вам не нужны все определения заголовка и структуры только для объявления аргументов функции.Предварительного объявления достаточно.
struct C; //not including C.h
struct C* f(struct C* p);
Это уменьшает кодовую связь и ускоряет компиляцию