본문 바로가기

Programings/Data Structs

[Data Struct] 큐 (Queue) - 링크드 리스트를 이용한 큐

반응형
#include <stdio.h>
#include <stdlib.h>

typedef struct _NODE // 새로운 타입 선언
{
	int Data;
	struct _NODE *Next;
} NODE;

NODE *Front, *Rear;  // Front = Get()함수를 쓸때 데이터 가져오기, Rear은 Put() 함수를 쓸때 데이터 저장하기 위해 사용
NODE *ptrNode;

void InitializeQueue(void);
void Put(int);
void DisplayQueue(void);
int Get(void);

void main()
{
	int ret;
	InitializeQueue();

	printf("Put() 함수를 호출해 보죠!\n");
	Put(1);
	Put(3);
	Put(10);
	Put(20);
	Put(12);
	printf("다섯 번의 Put() 호출 후 결과 : ");

	DisplayQueue();

	ret = Get();
	ret = Get();
	ret = Get();

	printf("\n세 번의 Get() 호출 후 결과 : ");
	DisplayQueue();

	ret = Get();
	ret = Get();

	printf("\n두 번의 Get() 호출 후 결과 : ");
	DisplayQueue();
}

void InitializeQueue(void)
{
	Front = (NODE *)malloc(sizeof(NODE));
	Rear = (NODE *)malloc(sizeof(NODE));

	Front -> Next = Rear;
	Rear -> Next = Rear; // 자기 자신을 다시 가리킨다.
}

void Put(int num) // Rear에서 자료를 삽입한다.
{
	ptrNode = (NODE *)malloc(sizeof(NODE));
	ptrNode -> Data = num;

	if(Front -> Next ==Rear)
	{
		Front->Next=ptrNode;
		ptrNode->Next=Rear;
		Rear->Next=ptrNode;
	}
	else // Front와 Rear 사이에 ptrNode가 계속 삽입된다.
	{ // 즉, Rear 바로 전 링크가 새로운 값을 저장한 노드로 계속 변경 된다.
		Rear->Next->Next=ptrNode;
		ptrNode->Next=Rear;
		Rear->Next=ptrNode;
	}
}

int Get(void) // Front에서 자료를 뺀다.
{
	int ret;
	NODE *deleteNode;

	printf("\n");
	if(Front->Next==Rear)
	printf("Queue Empty\n");
	else
	{
		deleteNode = Front ->Next;
		Front->Next=deleteNode->Next;
		ret=deleteNode ->Data;
		printf("get() : %d\n", ret);
		free(deleteNode); // malloc를 사용해 동적 할당을 했으니 꼭 free 시켜서 동적할당을 해제해야한다.
	}
	return ret;
}

void DisplayQueue(void)
{
	NODE *ptrTemp;

	if(Front->Next != Rear)
	{
		for(ptrTemp = Front ->Next; ptrTemp ->Next !=Rear; ptrTemp=ptrTemp->Next)
		printf("%d -> ", ptrTemp->Data);
		printf("%d\n", ptrTemp->Data);
	}
	else if(Front ->Next ==Rear)
	printf("Queue Empty\n");

}
반응형