이번에는 노드를 맨 뒤에 삽입하는 방법을 알아보자. 첫 번째 노드를 생성하는 과정은 동일하다.
노드를 맨 앞에 삽입할 때는 헤드의 위치를 계속 변경하면서 기존 노드가 뒤로 밀려나고 새로운 노드가 맨 앞에 생성되었다 (역순 연결). 그런데 노드를 맨 뒤에 삽입할 때는 테일의 위치를 계속 변경하면서 새로운 노드가 뒤에 추가된다.
맨 처음 첫 노드를 값 5로 생성하면 이 노드는 head이자 tail이 된다.
노드를 맨 뒤에 삽입하면, 새로운 노드가 기존의 마지막 노드 뒤에 추가된다. 예를 들어, 새 노드를 값 6으로 삽입하면 다음과 같은 과정이 진행된다.
- 새로운 노드의 prev를 현재의 tail로 설정한다.
- 현재의 tail의 next를 새로운 노드로 설정한다.
- 새로운 노드를 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;
}
}
이 함수는 새로운 노드를 리스트의 맨 끝에 삽입한다. 리스트가 비어있을 경우, 새로운 노드가 head와 tail이 된다.
그렇지 않으면, 새로운 노드는 현재의 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 함수에서는 노드를 삽입하고, 리스트의 모든 노드를 앞에서부터와 뒤에서부터 출력하여
삽입 결과를 확인한다.
'자료구조&알고리즘' 카테고리의 다른 글
단일 연결 리스트(Singly Linked List) (0) | 2024.10.05 |
---|---|
자료구조란? (5) | 2024.10.04 |
[이중 연결 리스트] 노드 구조체, 노드 생성, 노드 맨 앞 추가, 생성 된 순서의 역순 연결 (0) | 2024.06.01 |
[단일 연결 리스트] 문자열 노드 전체 제거 (0) | 2024.05.30 |
[단일연결리스트] 노드 정렬 삽입(오름차순) (0) | 2024.05.25 |