Допустим, мы определяем две структуры в C или C++ (я получаю одинаковый результат как в C, так и в C++, и я думаю, что правила одинаковы, скажите, если они не являются).
один с элементом значения неполного типа:
struct abc{
  int data;
  struct nonexsitnow next; //error: field ‘next has incomplete type, makes sense since "struct nonexsitnow" hasn't been declared or defined.
};
и один с указательным элементом неполного типа:
struct abc{
  int data;
  struct nonexsitnow *next; //pass?!
};
 Почему второе определение не вызывает никаких проблем? Он использует struct nonexsitnow который не был создан!
ОБНОВИТЬ:
Я завершаю этот лист из ответов и комментариев ниже, надеясь, что они будут правы и полезны для разработки.
 Как отметил @ArneVogel, обе struct Foo p; и struct Foo *p; является неявным объявлением Foo и struct Foo; явно делает эту работу (спасибо @Джон Боллинджер). Это почти ничего не значит для c, но имеет значение для c++ и поведения:
               In a situation where struct Foo is:
_______________________________________________________
|               | undeclared | declared but | defined |
|               |            | not defined  |         |
-------------------------------------------------------
|               |  C | C++   |  C  |  C++   | C | C++ |
-------------------------------------------------------
|struct Foo  p; |  × |  ×    |  ×  |   ×    | √ |  √  |
|struct Foo* p; |  √ |  √    |  √  |   √    | √ |  √  |
|       Foo  p; |  × |  ×    |  ×  |   ×    | × |  √  |
|       Foo* p; |  × |  ×    |  ×  |   √    | × |  √  |
