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;
}

큐 알고리즘 코드 및 설명

그림으로 하나하나 진행하면 이해하기 쉬워요~

반응형