All is well

[YYBASIC0302/얌얌코딩] 구조체 포인터 연결하기 본문

C++/YYBASIC

[YYBASIC0302/얌얌코딩] 구조체 포인터 연결하기

D0YUN 2025. 2. 9. 18:04

구조체 포인터를 이용한 노드 연결

  • `Node`라는 구조체를 사용하여 각 노드가 하나의 데이터다음 노드의 주소를 갖도록 연결해 연결 리스트 구조를 완성해보았습니다.
  • 노드를 연결하려면 노드 형 포인터 타입의 변수를 만들어 노드 간의 주소를 연결해 주어야 합니다.

구조체 포인터를 통한 링크드 리스트 구현

// YYBASIC03_02

#include <iostream>
using namespace std;

int main(void)
{
    /* 연결 리스트(Linked List) 노드 구조체 정의 */
    struct Node
    {
        int data;
        Node* next; // 다음 노드를 가리키는 포인터
    };

    // 연결 리스트 노드 선언 및 초기화
    Node* head; // 리스트의 첫 번째 노드를 가리킬 포인터
    Node n1, n2, n3;

    // 노드 연결 (연결 리스트 구성)
    head = &n1;
    n1.next = &n2;
    n2.next = &n3;
    n3.next = nullptr; // 마지막 노드는 nullptr을 가리켜야 함

    // 각 노드의 데이터 값 초기화
    n1.data = 1;
    n2.data = 2;
    n3.data = 3;


#pragma region Print Linked List (직접 접근 방식)
    cout << "< Print Linked List (직접 접근 방식) >" << endl;
    cout << "n1 : " << head->data << endl;
    cout << "n2 : " << head->next->data << endl;
    cout << "n3 : " << head->next->next->data << endl;
#pragma endregion


#pragma region Print Linked List with while() (순회 방식)
    cout << "\n< Print Linked List with while() (순회 방식) >" << endl;

    Node* temp = head; // head 값을 변경하지 않도록 임시 포인터 사용
    int n = 1;

    while (temp != nullptr) // 마지막 노드까지 출력하도록
    {
        cout << "n" << n++ << " : " << temp->data << endl;
        temp = temp->next; // 다음 노드로 이동
    }
#pragma endregion

    return 0;
}

1. `head` 포인터와 노드 연결

  • `head` 포인터는 연결 리스트의 첫 번째 노드를 가리키는 역할을 하며, `n1`을 가리키도록 설정하였습니다.
  • `n1.next`에 `n2`의 주소를 저장하고, `n2.next`에 `n3`의 주소를 저장함으로써 각 노드를 연결하여 단순 연결 리스트(Singly Linked List)를 구성하였습니다.
  • `n3` 노드의 `nex`t를 `nullptr`로 설정하여 리스트의 마지막 노드임을 명시하였습니다.
    • 이를 통해 while 문에서 마지막 노드까지 정상적으로 탐색할 수 있도록 처리하였습니다.

2. Print Linked List (직접 접근 방식)

  • 직접 구조체 포인터를 이용하여 연결 리스트의 각 노드에 접근하는 방식을 확인하였습니다.
  • `head`를 사용하여 첫 번째 노드부터 `next` 포인터를 따라가며 데이터를 출력하였습니다.
  • 이 방식은 노드 개수를 알고 있을 때 유용하지만, 노드 개수가 동적으로 변할 경우 적절하지 않음을 인지해야 합니다.

3. Print Linked List with while() (순회 방식)

  • while 문을 사용하여 연결 리스트의 각 노드를 순회하며 출력하는 방식을 구현하였습니다.
  • `temp` 포인터를 활용하여 `head`를 변경하지 않고, 리스트의 각 요소를 순차적으로 탐색할 수 있도록 하였습니다.
    • `head`를 직접 변경하지 않는 것은 중요한 포인트입니다. `head`가 변하면 리스트의 시작점을 잃어버리기 때문입니다.
  • `temp`가 `nullptr`이 될 때까지 반복하여 모든 노드를 출력하도록 하였습니다.
  • 각 노드를 출력한 후 `temp = temp->next;`를 수행하여 다음 노드로 이동하도록 하였습니다.

< 실행 결과 >

 

 

https://www.youtube.com/watch?v=CZRLEPhYPRM