본문 바로가기

C Language

linked list에서 s_list와 t_list로 구분하는 의미 | The reason of separating s_list from t_list in linked list.

struct s_list *next; struct t_list *next;로 변경하면 동일하지 않습니다. 그 이유는 C 언어에서 typedef struct의 작동 방식에 기인합니다.

이유 설명:

  1. 구조체 이름과 typedef 별도 관리:
    • typedef struct s_list t_list;를 사용하면, t_list struct s_list에 대한 별칭(alias)이 됩니다.
    • 그러나 struct t_list는 별도로 정의되지 않았으므로, 이를 사용하려고 하면 컴파일 오류가 발생합니다. 즉, t_list는 단순히 별칭일 뿐이고, 실제 구조체 이름은 여전히 struct s_list입니다.
  2. 자기 참조 구조체의 필요성:
    • 자기 참조 구조체(예: 연결 리스트의 노드)에서는 구조체 내부에서 자기 자신을 가리키는 포인터를 선언해야 합니다.
    • 이때, 구조체가 완전히 정의되기 전에 typedef된 이름(t_list)은 사용할 수 없습니다. 따라서 반드시 원래의 구조체 이름인 struct s_list를 사용해야 합니다.
    • 예를 들어, 아래와 같이 선언하면 문제가 없습니다:
       
      c
      typedef struct s_list { struct s_list *next; // 자기 참조 void *data; } t_list;
    • 하지만 만약 다음과 같이 변경하면 오류가 발생합니다:
       
      c
      typedef struct s_list { struct t_list *next; // 오류: struct t_list는 정의되지 않음 void *data; } t_list;
  3. 컴파일러의 처리 순서:
    • C 컴파일러는 코드를 순차적으로 처리하며, 구조체가 정의되기 전에 그 구조체를 참조하려고 하면 오류를 발생시킵니다.
    • typedef는 구조체 정의 이후에만 유효하므로, 구조체 내부에서는 원래 이름(struct s_list)을 사용해야 합니다.

결론:

  • struct s_list *next;는 올바른 선언이며, 자기 참조 구조체를 구현할 때 필수적입니다.
  • 이를 struct t_list *next;로 변경하면 컴파일 오류가 발생합니다. 이는 typedef된 이름이 구조체 내부에서 사용할 수 없기 때문입니다.

 

Changing `struct s_list *next;` to `struct t_list *next;` is not equivalent. This is due to how typedef and struct work in C language.

Explanation:

1. Separate management of struct names and typedef:
   - When using `typedef struct s_list t_list;`, t_list becomes an alias for struct s_list.
   - However, `struct t_list` is not separately defined, so attempting to use it will result in a compilation error. In other words, t_list is merely an alias, and the actual struct name remains struct s_list.

2. Necessity of self-referential structures:
   - In self-referential structures (e.g., nodes in a linked list), you need to declare a pointer to itself within the structure.
   - At this point, you cannot use the typedef'd name (t_list) before the structure is fully defined. Therefore, you must use the original struct name, struct s_list.

For example, declaring it like this is fine:
```c
typedef struct s_list {
    struct s_list *next; // self-reference
    void *data;
} t_list;
```

But if you change it to this, an error occurs:
```c
typedef struct s_list {
    struct t_list *next; // Error: struct t_list is not defined
    void *data;
} t_list;
```

3. Compiler processing order:
   - C compilers process code sequentially, and trying to reference a struct before it's defined will cause an error.
   - typedef is only valid after the struct definition, so within the struct, you must use the original name (struct s_list).

Conclusion:
- `struct s_list *next;` is the correct declaration and is essential when implementing self-referential structures.
- Changing it to `struct t_list *next;` will result in a compilation error. This is because the typedef'd name cannot be used inside the structure definition.