일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- APOLLO
- 컨테이너
- 타입스크립트
- alexnet
- 이진탐색
- 스택
- 배열
- 알고리즘
- RxJS
- 해시테이블
- C
- vue3
- GraphQL
- 프로세스
- 자바스크립트
- 자료구조
- Machine Learning
- RT scheduling
- 릿코드
- 연결리스트
- 프로그래머스
- 웹팩
- 코딩테스트
- 브라우저
- 포인터
- pytorch
- 연결 리스트
- 프론트엔드
- 큐
- cors
- Today
- Total
프린세스 다이어리
자료구조 큐를 C언어 연결 리스트로 구현하기 본문
1. 연결 리스트, 큐 구조체 만들기
#include <stdio.h>
#include <stdlib.h>
#define INF 99999999
typedef struct Node {
int data;
struct Node *next;
} Node;
typedef struct Queue {
Node *front;
Node *rear;
int count;
} Queue;
Queue에는 front, rear, 그리고 큐에 들어가 있는 원소들의 개수를 count로 정했다.
2. push 함수 구현하기
큐는 rear가 가리키는 노드 뒤쪽에 들어가기 때문에, 먼저 노드를 뒤에 만들어 놓고 rear의 next가 그 노드를 가리키게 만든 다음에, rear가 그 노드를 가리키도록 하면 된다.
void push(Queue *queue, int data) {
Node *node = (Node*) malloc(sizeof(Node));
node -> data = data;
node -> next = NULL;
if (queue -> count == 0) { // 큐가 비어 있을 때는 count값이 0이고
queue -> front = node; // front에 node를 넣어 준다. 첫번째 원소이기 때문이다. 초기세팅이다.
} else { // 첫번째가 아닌 경우에는 다 rear 뒤쪽에 넣는다.
queue -> rear -> next = node; // rear의 다음 노드가 node가 되고
}
queue -> rear = node; // rear가 node가 된다.
queue -> count++;
}
push 함수는 queue와 data를 매개변수로 갖는다. 앞서 그림으로 본 것처럼 먼저 node를 만들어서 메모리 할당을 해 준다. node의 구조인 data, next가 가리키는 것을 각각 정한다. 만약 큐의 count가 0일 때는 큐가 비어 있다는 의미이므로 front를 node로 설정해 주고, count가 0이 아닐 때는 rear의 next가 node를 가리키게 한다. 그러고 나서 rear를 node로 재설정해 주고, 큐의 count를 1 올리면 push가 끝난다.
3. pop 함수 구현하기
pop함수는 front가 그다음 노드를 가리키게 한 후, 기존 front를 메모리 해제해 주면 된다.
int pop(Queue *queue) {
if (queue -> count == 0)
{
printf("큐 언더플로우");
return -INF;
}
Node *node = queue -> front;
int data = node -> data;
queue -> front = node -> next;
free(node);
queue -> count--;
return data;
}
일단 삭제할 노드를 Node *node 라고 해 준다. 그리고 그건 현재 큐의 front에 해당하는 것이다. 또 정수형 data를 선언해서 현재 front의 data를 담아둔다. 그리고 앞서 그림으로 살펴본 pop 과정처럼, 큐의 front를 node의 next로 바꿔 가리키게 한 후, 기존 front였던 node를 메모리 해제해 준다. 그리고 계속 잊게 되는데 queue의 count를 1 빼줘야 한다. 담아 두었던 기존 front의 data를 리턴하면 pop함수 끝이다.
4. 큐 전체 구현하기
void show(Queue *queue) {
Node *cur = queue -> front;
while (cur != NULL)
{
printf("%d \n", cur -> data);
cur = cur -> next;
}
}
int main(void)
{
Queue queue;
queue.front = queue.rear = NULL;
queue.count = 0;
push(&queue, 7);
push(&queue, 5);
push(&queue, 4);
pop(&queue);
push(&queue, 6);
pop(&queue);
show(&queue);
}
4
6
show 함수에서 큐의 cur을 next로 하나씩 옮겨주면서 프린트한다. main 함수에서 push, pop 함수를 구현하면 올바른 결과가 나온다.
'C, C++' 카테고리의 다른 글
[C] 퀵 정렬이란? C언어로 퀵 정렬 구현하는 코드 (0) | 2021.11.10 |
---|---|
[C] 선택 정렬과 삽입 정렬 원리, C언어로 구현하기 (0) | 2021.11.06 |
incompatible pointer types assigning to 'struct Node *' from 'Node *' [-Wincompatible-pointer-types] 해결 방법 (0) | 2021.10.14 |
[C] 전처리기를 사용하여 프로그램을 작성하는 방법 (0) | 2021.10.12 |
[C] 파일 입출력이 왜 필요한가요? C언어로 파일 입출력 해보기 (0) | 2021.10.01 |