Sergey already gave you the correct answer, I just add an example:
File a.h
#ifndef __A_H__
#define __A_H__
struct A; struct B { struct A * element; };
#endif // __A_H__
File b.h
#ifndef __B_H__
#define __B_H__
struct B; struct A { struct B * element; };
#endif // __B_H__
File m.c
#include "a.h"
#include "b.h"
int main()
{
struct A a;
struct B b;
a.element = &b;
b.element = &a;
return 0;
}
An alternative would be putting forward declarations in the C source file, before actually including the headers:
#ifndef __A_H__
#define __A_H__
struct B { struct A * element; };
#endif // __A_H__
#ifndef __B_H__
#define __B_H__
struct A { struct B * element; };
#endif // __B_H__
struct A;
struct B;
#include "a.h"
#include "b.h"
int main()
{
struct A a;
struct B b;
a.element = &b;
b.element = &a;
return 0;
}