연결리스트를 사용한 프로그램을 제작중인데 이 둘의 차이가 있나요?

willisone의 이미지

위의 코드로 작성하니까 에러가 나오다가 밑의 코드로 작성하니까 에러가 나질 않네요... 위 두 코드에서 어떤 차이가 발생하는 건가요??

아직 실력이 부족한 제가 봤을 때는 typedef를 먼저 하느냐 나중에 하느냐의 차이 같은데 무슨 차이인가요?

typedef struct
{
     struct Student* next;
}Student;
 
struct Stu
{
     struct Stu* next;
};
 
typedef Stu Student;
 의 이미지

// #1
typedef struct // 지금 struct에는 이름이 없습니다.
{
     struct Student* next; // 이 시점에서 struct Student가 뭔지 알 수 없죠
}Student; // 여기까지 와서야 알 수 있죠
 
// #2
struct Stu // 여기서는 이름이 있죠
{
     struct Stu* next; // struct Stu가 뭔지 압니다.
};
 
typedef Stu Student; // 별칭 붙이는 것도 자유롭게.
 
// #3
typedef struct Stu // 이렇게 할 수도 있어요. 여기서 임시로 이름을 붙이고,
{
     struct Stu* next; // 일단은 임시 이름을 쓴 뒤
}Student; // 별칭을 붙이는 거죠.