연결리스트를 이용한 큐의 구현 | 연결큐 - C 언어

2021. 5. 27. 21:52·C
728x90
반응형

연결 큐

1차원 배열을 이용하기 때문에 크기가 정해져 있는 원형 큐의 문제점을 보완해 나온 것이 연결 리스트를 이용한 연결 큐.

원형 큐에 대한 설명은 아래 글로 👇🏻

https://tildacoderecorder.tistory.com/102

 

[ 자료구조 ] enQueue()와 deQueue() 함수를 이용한 원형큐

큐의 개념과 구조 큐 : 스택과 다르게 "선입선출"의 구조를 가지고 있다. 먼저 들어간 것이 먼저 나오는 구조. FIFO = First In First Out 순차큐의 문제점을 보완해 나온 것이 원형큐 = 1차원 배열을 사

tildacoderecorder.tistory.com

 

큐의 원소는 연결 리스트의 노드이고, 각 노드를 포인터로 연결한다.

연결 큐의 구조

 

front = 첫 번째 노드를 가리키는 포인터 변수 (기존 연결 리스트의 head와 같다.)

rear = 마지막 노드를 가리키는 포인터 변수

초기 상태와 공백 상태 : front = rear = null

연결 큐는 노드를 무한으로 생성해 추가할 수 있기 때문에 큐의 포화 상태는 확인하지 않는다. 대신 공백 상태는 확인해야 하는데 첫번째 노드를 가리키는 front의 포인터 변수가 null이라면 공백 상태.

기본 설정

1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
#include<stdlib.h>
 
typedef struct node {
  int data;
  struct node* next;
} Node;
 
Node *front = NULL;
Node *rear = NULL;
cs

 

정수형 데이터와 포인터 변수 next를 가진 노드 생성 후 front와 rear를 NULL로 초기화.

 

연결 큐의 삽입 알고리즘

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int enQueue(int item) {
 
  Node* new = (Node*)malloc(sizeof(Node));
 
  new->data = item;
  new->next = NULL;
 
  if ( front == NULL ) {
    rear = new;
    front = new;
    return 1;
  }
 
  rear->next = new;
  rear = new;
  return 1;
}
Colored by Color Scripter
cs

 

먼저 새 노드 new를 생성해준 뒤, data에 삽입할 원소 item을 넣어준다.

그 후, if문으로 연결큐의 공백 상태를 확인해준다. 만약 공백 상태여서 새 노드 new가 첫번째 노드라면, front와 rear 모두 new를 가리키도록 하고 1을 리턴하며 종료한다.

그렇지 않다면 연결 큐의 노드 중 가장 마지막이 되므로 rear가 가리켜야 한다. 현재 rear는 노드 new가 들어오기 전 마지막 노드를 가리키고 있으므로 먼저 rear->next는 마지막 노드의 포인터 변수이다. 노드와 노드를 연결시켜야 하기 때문에 마지막 노드의 포인터 변수가 새 노드 new를 가리키도록 rear->next = new를 해준다.

마지막으로 rear = new로 rear가 new를 가리키도록 하고 1을 리턴하며 종료.

 

연결 큐의 삭제 알고리즘

 

1
2
3
4
5
6
7
8
9
10
11
12
13
int deQueue() {
  if( front == NULL ) return 0;
 
  Node* old = (Node*)malloc(sizeof(Node));
 
  old = front;
  int item = front->data;
  front = front->next;
 
  if ( front == NULL ) rear = NULL;
 
  return item;
}
Colored by Color Scripter
cs

 

큐는 선입선출의 구조로 가장 첫번째 데이터가 삭제되기 때문에 front가 가리키는 노드가 삭제되어야 한다. 먼저 공백 상태를 확인해 삭제할 노드가 없다면 에러 메세지와 함께 종료.

그렇지 않다면 삭제를 도와줄 새 노드 old 생성 후, old = front로 old와 front 모두 첫번째 노드를 가리키도록 한다. item이라는 정수형 변수를 만들어 front가 가리키는 첫번째 노드의 data를 담는다.

이후 front = front->next로 front->next는 첫번째 노드의 포인터 변수가 가리키고 있던 두번째 노드이다. front가 두번째 노드를 가리키도록 함으로써 첫번째 노드는 논리적으로 삭제되는 셈이다.

마지막으로 연결 큐에 노드가 딱 하나 존재해서 front도 rear도 모두 첫번째 노드를 가리키고 있는 상태에서 첫번째 노드를 삭제 해 front가 NULL이 되었다면 rear도 NULL이 되어야 하므로 rear = NULL 하며 삭제한 원소 item을 리턴하며 종료.

 

참고 : C로 배우는 쉬운 자료구조 / 이지영 / 한빛아카데미

 

728x90
반응형
저작자표시 비영리 변경금지

'C' 카테고리의 다른 글

이진 탐색 트리의 탐색/삽입/삭제 연산 - C언어  (1) 2021.05.30
트리와 이진트리의 개념과 구조 - C언어  (0) 2021.05.28
enQueue( )와 deQueue( ) 함수를 이용한 원형큐 - C 언어  (0) 2021.05.26
push( ) 와 pop( ) 함수를 이용한 스택 - C 언어  (0) 2021.04.22
선형 리스트 삽입/삭제/탐색/종료 - C 언어  (0) 2021.04.16
'C' 카테고리의 다른 글
  • 이진 탐색 트리의 탐색/삽입/삭제 연산 - C언어
  • 트리와 이진트리의 개념과 구조 - C언어
  • enQueue( )와 deQueue( ) 함수를 이용한 원형큐 - C 언어
  • push( ) 와 pop( ) 함수를 이용한 스택 - C 언어
waVwe
waVwe
    반응형
  • waVwe
    waVwe 개발 블로그
    waVwe
  • 전체
    오늘
    어제
    • ALL (184)
      • Python (1)
      • Spring (15)
      • DevOps (10)
      • Git (6)
      • JAVA (4)
      • C (22)
      • 코테 문제 풀이 (124)
        • 프로그래머스 (43)
        • 백준 (2)
        • 정올 (64)
        • SW Expert Academy (1)
        • 온코더 oncoder (14)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

    • 🐙 Github
  • 공지사항

  • 인기 글

  • 태그

    devops
    스프링부트
    정올
    자료구조
    도커
    Til
    깃헙
    연결리스트
    자바
    내일배움캠프
    형변환
    CI/CD
    MSA
    C언어
    깃
    이진트리
    스파르타코딩
    springboot
    프로그래머스
    아파치카프카
    알고리즘
    progate
    온코더
    C
    java
    코테
    docker
    while문
    스파르타코딩클럽
    스프링
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
waVwe
연결리스트를 이용한 큐의 구현 | 연결큐 - C 언어
상단으로

티스토리툴바