원형 연결리스트
- 마지막 노드가 첫번째 노드를 가리키는 리스트이다.
선형 연결리스트는 마지막 노드가 NULL을 가리키지만
원형 연결리스트는 첫번째 노드의 주소를 가리킨다.
- 이렇게 된다면 선형 연결리스트보다 삽입, 삭제가 더 쉬워진다.
선형 연결리스트는 맨 마지막 노드에 삽입하고자 할 때
head 노드부터 마지막 노드까지 전부 지나가야 하지만
원형 연결리스트는 head->link에 삽입하고
새로운 노드를 head가 되도록 하면 되므로 훨씬 쉬워진다.
- 노드를 맨 앞에 삽입하는 함수
//노드를 맨 앞에 삽입하는 함수
//원형 연결리스트이므로 head->link에 노드를 삽입하면 맨 앞에 삽입할 수 있다.
ListNode* insert_first(ListNode* head){
int data;
ListNode* new_node;
printf("input data : ");
scanf("%d", &data);
new_node = create_node(data);
if(head == NULL){
head = new_node;
new_node->link = head;
}else{
new_node->link = head->link;
head->link = new_node;
}
return head;
}
- 노드를 맨 뒤에 삽입하는 함수
원형 연결 리스트는 어디가 맨 앞이고 뒤인지 불분명하므로
지금 새로 삽입된 노드가 맨 뒤인 head 포인터가 되면 된다.
따라서 맨 앞에 삽입하는 함수에서 새로운 노드가 head라고 지정해주기만 하면 된다.
//노드를 맨 뒤에 삽입하는 함수
ListNode* insert_last(ListNode* head){
int data;
ListNode* new_node;
printf("input data : ");
scanf("%d", &data);
new_node = create_node(data);
if(head == NULL){
head = new_node;
new_node->link = head;
}else{
new_node->link = head->link;
head->link = new_node;
head = new_node;
}
return head;
}
<<전체 코드>>
더보기
//원형 연결리스트
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode{
int data;
struct ListNode *link;
}ListNode;
//노드 생성 함수
ListNode* create_node(int data){
ListNode* node;
node = (ListNode*)malloc(sizeof(ListNode));
node->data = data;
node->link = NULL;
return node;
}
//노드를 맨 앞에 삽입하는 함수
//원형 연결리스트이므로 head->link에 노드를 삽입하면 맨 앞에 삽입할 수 있다.
ListNode* insert_first(ListNode* head){
int data;
ListNode* new_node;
printf("input data : ");
scanf("%d", &data);
new_node = create_node(data);
if(head == NULL){
head = new_node;
new_node->link = head;
}else{
new_node->link = head->link;
head->link = new_node;
}
return head;
}
//노드를 맨 뒤에 삽입하는 함수
//원형연결리스는 어디가 맨 앞이고 뒤징지 불분명하므로
//지금 새로 삽입된 노드가 맨 뒤 즉 head 포인터가 되면 된다.
ListNode* insert_last(ListNode* head){
int data;
ListNode* new_node;
printf("input data : ");
scanf("%d", &data);
new_node = create_node(data);
if(head == NULL){
head = new_node;
new_node->link = head;
}else{
new_node->link = head->link;
head->link = new_node;
head = new_node;
}
return head;
}
//전체 노드를 출력하는 함수
void print_node(ListNode* head){
while(head != NULL){
printf("%d ", head->data);
head = head->link;
}
printf("\n");
}
int main(int argc, const char * argv[]) {
ListNode* head = NULL;
ListNode* pre_node;
int menu;
do{
printf("========================\n");
printf("1.insert_first 2.insert_last 3.print_node 4.end\n");
printf("========================\n");
printf("menu : ");
scanf("%d", &menu);
if(menu == 1){
head = insert_first(head);
}else if(menu == 2){
head = insert_last(head);
}else if(menu == 3){
print_node(head);
}
}while(menu != 4);
}
'CS > 자료구조' 카테고리의 다른 글
[자료구조] 배열로 구현한 스택(stack) (0) | 2022.06.13 |
---|---|
[자료구조] 연결리스트로 구현한 스택(stack) (0) | 2022.06.13 |
[자료구조] 연결리스트(Linked List) (0) | 2022.06.09 |
[자료구조] 시간복잡도, 빅오표기법 (0) | 2022.04.26 |
[자료구조] 재귀(순환)함수 recursion - 하노이 탑 (0) | 2022.04.25 |