Все правы во всем.
Ключевым моментом является то, что даже если вы знаете, что внутреннее представление указателя является адресом, независимо от типа данных, C не делает такого предположения.
Включение явного типа позволяет компилятору лучше выполнять проверку кода.
Конечно, вы всегда можете привести указатель к другому типу, но тогда вам нужно использовать приведенный тип в егоправильный контекст.
Кстати, строгое изучение CI (еще в юрский период) не позволило бы вам первый пример (C ++ делает и некоторые современные компиляторы C).Вместо этого вы должны были бы сказать
struct Node {
struct Node* next;
struct Node* previous;
// data };