e. 자료구조 및 알고리즘
C언어 단방향 큐 (Queue)
로봇쟁이
2019. 6. 28. 00:10
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
typedef struct _node
{
int data;
struct _node *next;
} Node;
typedef struct _lQueue
{
Node *front; // 삭제할 노드를 가리키는 용도
Node *rear; // 생성된 노드를 가리키는 용도
} LQueue;
typedef LQueue Queue;
void QueueInit(Queue *target); // 큐 초기화 함수
int QIsEmpty(Queue *target); // 큐에 데이터가 존재하는지 확인하는 함수
void Enqueue(Queue *target, int data); // 큐에 데이터를 저장하는 함수
int Dequeue(Queue *target); // 큐의 데이터를 반환하는 함수
int QPeek(Queue *target); // 큐의 데이터를 조회하는 함수
void QueueInit(Queue *target) // 큐 초기화 함수
{
target->front = NULL;
target->rear = NULL;
}
int QIsEmpty(Queue *target) // 큐에 데이터가 존재하는지 확인하는 함수
{
if (target->front == NULL)
return TRUE;
else
return FALSE;
}
void Enqueue(Queue *target, int data) // 큐에 데이터를 저장하는 함수
{
Node*newNode = (Node*)malloc(sizeof(Node));
newNode->next = NULL; // 새로운노드의 다음노드는 없음
newNode->data = data; // 새로운노드의 데이터를 저장
if (QIsEmpty(target)) // 처음 새로운노드이면
{
target->front = newNode; // front는 새로운 노드
target->rear = newNode; // rear는 새로운 노드
}
else // 이미 데이터가 있으면
{
target->rear->next = newNode; // 기존 rear의 next는 새로운 노드와 연결
target->rear = newNode; // rear는 새로운 노드로 변경
}
}
int Dequeue(Queue *target) // 큐의 데이터를 반환하는 함수
{
Node*delNode;
int retData; // 삭제할 노드 데이터 저장할 변수
if (QIsEmpty(target)) // 큐의 데이터가 없으면
{
printf("Queue Memory Empty!!");
exit(-1);
}
delNode = target->front; // front 노드를 del노드로 지정
retData = delNode->data; // 데이터 저장
target->front = target->front->next; // front를 다음 front로 변경
free(delNode); // 노드 메모리 삭제
return retData; // 삭제된 데이터 반환
}
int QPeek(Queue *target) // 현재 위치 데이터를 조회하는 함수
{
if (QIsEmpty(target))
{
printf("Queue Memory Empty!!");
exit(-1);
}
return target->front->data;
}
void printQueue(Queue *target) // 큐의 남은 데이터를 출력하는 함수
{
while (!QIsEmpty(target)) printf("%d ", Dequeue(target));
}
int main(void)
{
Queue Q;
QueueInit(&Q);
Enqueue(&Q, 11);
Enqueue(&Q, 22);
Enqueue(&Q, 33);
Enqueue(&Q, 44);
Dequeue(&Q);
printQueue(&Q);
return 0;
}
큐 알고리즘 코드 및 설명
그림으로 하나하나 진행하면 이해하기 쉬워요~
반응형