[자료구조] 원형 연결 리스트 (Circular Linked List)CSE/자료구조 (data structure)2022. 10. 8. 00:00
Table of Contents
반응형
원형 연결 리스트 (Circular Linked List)
원형 연결 리스트는 마지막 노드가 첫 번째 노드를 가리키는 리스트입니다.
단순 연결 리스트는 마지막 노드의 link 필드가 NULL이라고 언급했습니다. 하지만, 원형 연결 리스트는 NULL이 아니라 첫 번째 노드 주소가 됩니다. 마지막 노드를 방문해도 첫 번째 노드로 가게 되고 모든 노드가 link 멤버에 NULL이 되어 있지 않은 상태로 연결되어 있는 상태가 됩니다.
이렇게 된다면 노드를 삽입할 때 상수 시간으로 고정이 된다는 장점이 있습니다. 기존에 단순 연결 리스트에서는 끝에 노드를 삽입하기 위해 리스트의 길이만큼 걸리게 되지만, 원형 연결 리스트에서는 헤드 포인터 자체를 옮겨버리면 되기 때문에 훨씬 적은 시간 안에 연산이 이루어지게 됩니다.
함수별로 어떻게 동작하는지 살펴보겠습니다.
*insert_first(*head, data)
원형 연결 리스트의 처음 부분에 노드를 삽입하는 과정은 다음과 같습니다.
- 새로운 노드인 node를 동적으로 메모리 할당한다.
- node의 data 멤버에 함수의 parameter로 넘어온 data 값을 넣어준다.
- (헤드 포인터가 NULL이면)
- node를 헤드 포인터가 가리키도록 하고,
- 헤드 포인터가 node를 가리키도록 한다. 즉, 자기를 순환 참조하도록 만든다.
- (그렇지 않으면)
- 헤드 포인터가 가리키는 노드 ( == 제일 앞에 있는 노드 )가 가리키던 노드를 node가 가리키도록 하고
- 헤드 포인터가 가리키는 노드 ( == 제일 앞에 있는 노드) 가 node를 가리킨다.
ListNode *insert_first(ListNode *head, element data) {
ListNode *node = (ListNode *)malloc(sizeof(ListNode)); // 1.
node->data = data; // 2.
if(head == NULL) { // 3.
head = node; // 4.
node->link = head; // 5.
} else { // 6.
node->link = head->link; // 7.
head->link = node; // 8.
}
return head;
}
*insert_last(*head, data)
원형 연결 리스트의 마지막 부분에 노드를 삽입하는 과정은 다음과 같습니다.
- 새로운 노드인 node를 동적으로 메모리 할당한다.
- node의 data 멤버에 함수의 parameter로 넘어온 data 값을 넣어준다.
- (헤드 포인터가 NULL이면)
- node를 헤드 포인터가 가리키도록 하고,
- 헤드 포인터가 node를 가리키도록 한다. 즉, 자기를 순환 참조하도록 만든다.
- (그렇지 않으면)
- 헤드 포인터가 가리키는 노드 ( == 제일 앞에 있는 노드 )가 가리키던 노드를 node가 가리키도록 하고
- 헤드 포인터가 가리키는 노드 ( == 제일 앞에 있는 노드) 가 node를 가리킨다.
- node를 헤드 포인터가 가리킨다.
ListNode *insert_last(ListNode *head, element data) {
ListNode *node = (ListNode *)malloc(sizeof(ListNode)); // 1.
node->data = data; // 2.
if(head == NULL) { // 3.
head = node; // 4.
node->link = head; // 5.
} else { // 6.
node->link = head->link; // 7.
head->link = node; // 8.
head = node; // 9.
}
return head;
}
전체 코드는 아래와 같습니다.
ListNode *insert_first(ListNode *head, element data) {
ListNode *node = (ListNode *)malloc(sizeof(ListNode));
node->data = data;
if(head == NULL) {
head = node;
node->link = head;
} else {
node->link = head->link;
head->link = node;
}
return head;
}
ListNode *insert_last(ListNode *head, element data) {
ListNode *node = (ListNode *)malloc(sizeof(ListNode));
node->data = data;
if(head == NULL) {
head = node;
node->link = head;
} else {
node->link = head->link;
head->link = node;
head = node;
}
return head;
}
void print_list(ListNode *head) {
ListNode *p;
if(head == NULL) return;
p = head -> link;
do {
printf("%d->", p->data);
p = p->link;
} while (p -> data);
}
728x90
반응형
'CSE > 자료구조 (data structure)' 카테고리의 다른 글
[자료구조] 트리 (Tree) (2) | 2022.10.16 |
---|---|
[자료구조] 이중 연결 리스트 (Double Linked List) (0) | 2022.10.09 |
[자료구조] 연결 리스트 (Linked List) (0) | 2022.10.07 |
[자료구조] 덱 (Deque) (0) | 2022.10.06 |
[자료구조] 원형 큐 (Circular Queue) (0) | 2022.10.05 |
@junyeokk :: 나무보다 숲을
컴퓨터 전공 관련, 프론트엔드 개발 지식들을 공유합니다. React, Javascript를 다룰 줄 알며 요즘에는 Typescript에도 관심이 생겨 공부하고 있습니다. 서로 소통하면서 프로젝트 하는 것을 즐기며 많은 대외활동으로 개발 능력과 소프트 스킬을 다듬어나가고 있습니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!