본문 바로가기
개념/혼자 공부하는 C언어

chapter 17) 자기 참조 구조체로 list 만들기

by kiseno 2024. 10. 3.
728x90
반응형
SMALL
#include <stdio.h>

struct list{
    int num;
    struct list *next;
};

int main(void){
    struct list a = {10, 0}, b = {20,0}, c = {30,0};
    struct list *head = &a, *current;

    a.next = &b, b.next = &c;
    
    printf("head -> num : %d\n", head -> num);
    printf("head -> next -> num : %d\n", head -> next -> num);

    printf("list all :");
    current = head;
    while(current != NULL){
        printf("%d ", current -> num);
        current = current -> next;
    }
    printf("\n");

    return 0;
}

### 구조체 정의

- `struct list`는 연결 리스트의 노드를 정의하는 구조체입니다. 각 노드는 `num` 필드를 가지며, 이는 노드에 저장된 데이터입니다. `next` 포인터는 다음 노드를 가리킵니다. 마지막 노드의 `next`는 `NULL`로 설정하여 리스트의 끝을 표시합니다.

### 연결 리스트 초기화

- `struct list a = {10, 0}, b = {20, 0}, c = {30, 0};`를 통해 세 개의 노드 `a`, `b`, `c`를 초기화합니다. 각각의 `num` 필드에는 10, 20, 30이 저장됩니다. `next` 포인터는 초기에 `0` (또는 `NULL`)으로 설정됩니다.
- `a.next = &b, b.next = &c;`를 통해 각 노드를 연결합니다. 이렇게 하면 `a`는 `b`를, `b`는 `c`를 가리키게 되며, `c`의 `next`는 초기값 `NULL`을 유지하여 리스트의 끝을 나타냅니다.

### 리스트 순회 및 데이터 출력

- `struct list *head = &a, *current;`를 통해 리스트의 시작을 가리키는 `head` 포인터와 현재 탐색 중인 노드를 가리킬 `current` 포인터를 선언합니다.
- 먼저 `head` 노드의 `num` 값과 `head`의 다음 노드 (`head -> next`)의 `num` 값을 출력하여 연결이 정상적으로 이루어졌는지 확인합니다.
- `while(current != NULL)` 루프를 통해 리스트의 시작부터 끝까지 순회합니다. 각 노드의 `num` 값을 출력하고, `current`를 다음 노드로 업데이트하여 리스트의 모든 데이터를 출력합니다.

### 실행 결과

이 프로그램을 실행하면 다음과 같은 출력을 얻게 됩니다:

```
head -> num : 10
head -> next -> num : 20
list all :10 20 30 
```

첫 번째 두 줄은 `head`가 정상적으로 첫 번째 노드를 가리키고 있으며, `head -> next`가 두 번째 노드를 정확히 가리키고 있음을 확인시켜 줍니다. 마지막 줄은 연결 리스트를 순회하며 모든 노드의 `num` 값을 출력하여 리스트 전체의 데이터를 보여줍니다. 이 예제는 기본적인 연결 리스트의 구현과 사용 방법을 보여줍니다.

728x90
반응형
LIST