본문 바로가기

자료구조&알고리즘

[이중 연결 리스트] 노드를 맨 뒤에 삽입하는 방법

이번에는 노드를 맨 뒤에 삽입하는 방법을 알아보자. 첫 번째 노드를 생성하는 과정은 동일하다.

노드를 맨 앞에 삽입할 때는 헤드의 위치를 계속 변경하면서 기존 노드가 뒤로 밀려나고 새로운 노드가 맨 앞에 생성되었다 (역순 연결). 그런데 노드를 맨 뒤에 삽입할 때는 테일의 위치를 계속 변경하면서 새로운 노드가 뒤에 추가된다. 

 

맨 처음 첫 노드를 값 5로 생성하면 이 노드는 head이자 tail이 된다.

 

노드를 맨 뒤에 삽입하면, 새로운 노드가 기존의 마지막 노드 뒤에 추가된다. 예를 들어, 새 노드를 값 6으로 삽입하면 다음과 같은 과정이 진행된다. 

  1. 새로운 노드의 prev를 현재의 tail로 설정한다.
  2. 현재의 tail의 next를 새로운 노드로 설정한다.
  3. 새로운 노드를 tail로 설정한다.

이 과정이 반복되면, 삽입된 순서대로 노드가 연결된다. 

 

1. 구조체 정의

typedef struct doublyNode {
    int value;
    struct doublyNode* next;
    struct doublyNode* prev;
} DNode;

이중 연결 리스트의 노드를 정의하는 구조체이다. 각 노드는 값(value), 다음 노드에 대한 포인터(next), 이전 노드에 대한 포인터(prev)를 가진다. 

 

2. 전역 변수 

DNode* head = NULL;
DNode* tail = NULL;

리스트의 시작과 끝을 가리키는 head 와 tail 포인터를 NULL 로 초기화해준다. 

 

3. 노드 끝에 삽입 함수 

void insertDNodeTail(int data) {
    DNode* newNode = (DNode*)malloc(sizeof(DNode)); // 새로운 노드를 할당
    newNode->value = data;
    newNode->prev = newNode->next = NULL;

    if (head == NULL) {
        head = newNode;
        tail = newNode;
    } else {
        // 맨 뒤에 삽입
        tail->next = newNode;
        newNode->prev = tail;
        tail = newNode;
    }
}

이 함수는 새로운 노드를 리스트의 맨 끝에 삽입한다. 리스트가 비어있을 경우, 새로운 노드가 headtail이 된다.

그렇지 않으면, 새로운 노드는 현재의 tail 뒤에 삽입된다. 

 

4. 테스트 및 출력 

int main() {
    insertDNodeTail(10);
    insertDNodeTail(20);
    insertDNodeTail(30);

    // 리스트 출력 (앞에서부터)
    DNode* current = head;
    while (current != NULL) {
        printf("%d ", current->value);
        current = current->next;
    }
    printf("\n");

    // 리스트 출력 (뒤에서부터)
    current = tail;
    while (current != NULL) {
        printf("%d ", current->value);
        current = current->prev;
    }
    printf("\n");

    return 0;
}

main 함수에서는 노드를 삽입하고, 리스트의 모든 노드를 앞에서부터와 뒤에서부터 출력하여

삽입 결과를 확인한다.