컴퓨터기본/자료구조

3. Queue

차가운오미자 2021. 6. 14. 21:24

1. Queue란?

- linear list in which data can only be inserted at one end

(한 쪽 끝에서만 데이터가 들어가지는 연결 리스트)

- has rear and front (rear와 front를 가짐)

- ensures that data are processed in the order in which they are received (FIFO)

(들어온 순서대로 데이터가 , first in first out)

 

Operations

1) Create Queue

2) Enqueue

3) Dequeue

4) Destroy Queue

 

2. 구현

이번에는 큐 안에 저장될 데이터를 기본 데이터형으로 하지 않고 바로 구조체로 만들어보았다.

 

student.c & student.h

기존에 정의된 것과 같음

// student.h
#include <stdio.h>

typedef struct student {
	char name[10];
	int age;
}Student;

void printStudent(Student* stu);
int compareStudent(Student* stu1, Student* stu2);
Student* createStudent(char* n, int a);
// student.c
#include <stdio.h>
#include <string.h>
#include "Student.h"

void setStudent(Student* stu, char* n, int a) {
	strcpy_s(stu->name, 10, n);
	stu->age = a;
}

void printStudent(Student* stu) {
	printf("name: %s, age: %d \n", stu->name, stu->age);
}

int compareStudent(Student* stu1, Student* stu2) {
	if (stu1->age == stu2->age)
		return 1;
	else
		return 0;
}
// allocate memory for Student structure, set name and age
Student* createStudent(char* n, int a) {
	Student* stu = (Student*)malloc(sizeof(Student));
	strcpy_s(stu->name, 10, n);
	stu->age = a;

	return stu;
}

queue.h

#include <stdio.h>
#include "student.h"

#define TRUE 1
#define FALSE 0

typedef Student LData;

typedef struct node {
	
	LData* data;
	struct NODE* next;
	
}NODE;

typedef struct myqueue {
	NODE* front;
	NODE* rear;
	int count;
	//int size;
}Queue;

Queue* createQ();
void insertQ(Queue* q, LData* data);
LData retrieveQ(Queue* q);
int isEmpty(Queue* q);
void printQ(Queue* q);
void destroyQ(Queue* q);

 

queue.c

- 이번에는 queue의 사이즈를 특별히 지정하지 않았다.

- retrieveQ()의 반환값을 LData로 한 것은 retrieve 시 노드를 없앨 때 노드의 data부분도 free 해줘야 하기 때문에, 포인터를 반환하는 것이 아니라 데이터 자체를 반환하는 것이 낫겠다고 판단함. 대신에 main에서 printStudent()를 호출할 때 LData자체를 넘겨주는 것이 아니라, 그 주소값을 넘겨줬다.(printStudent()가 LData포인터를 매개변수로 받기 때문)

#include <stdio.h>
#include <stdlib.h>

#include "queue.h"

Queue* createQ() {

	Queue* q = (Queue*)malloc(sizeof(Queue));
	if (q != NULL) {
		q->front = NULL;
		q->rear = NULL;
		q->count = 0;
	}
}

void insertQ(Queue* q, LData* data) {

	NODE* newNode = (NODE*)malloc(sizeof(NODE));
	if (newNode != NULL) {
		newNode->next = NULL;
		newNode->data = data;
	}
	if (isEmpty(q)) {
		q->front = newNode;
	}
	else {
		q->rear->next = newNode;
	}
	q->rear = newNode;
	q->count++;
}

LData retrieveQ(Queue* q) {

	NODE* temp;
	LData tempd;

	if (isEmpty(q)) {
		printf("The queue is empty \n");
		return;
	}
	temp = q->front; // copy to free memory
	tempd = *(q->front->data); // copy to return data
	q->front = q->front->next; // reset front
	free(temp->data); // free memory of the data inside node
	free(temp); // free node memory
	q->count--;
	return tempd;
}



int isEmpty(Queue* q) {
	if (q->count == 0)
		return TRUE;
	else
		return FALSE;
}

void printQ(Queue* q) {

	printf("print Queue: \n");
	NODE* temp = q->front;
	for (int i = 0; i < q->count; i++) {
		printStudent(temp->data);
		temp = temp->next;
	}
	printf("\n");
}
void destroyQ(Queue* q) {
	
	NODE* temp = NULL;
	while (q->front != NULL) {
		temp = q->front;
		q->front = q->front->next;
		free(temp->data);
		free(temp);
	}
	free(q);
	printf("Queue destroyed! \n");

}

main.c

#include <stdio.h>
#include "queue.h"

int main(void) {

	// create queue
	Queue* myq = createQ();

	// insert data into queue
	insertQ(myq, createStudent("nyam", 20));
	insertQ(myq, createStudent("oyam", 21));
	insertQ(myq, createStudent("pyam", 22));
	insertQ(myq, createStudent("ryam", 23));
	printQ(myq); // check if data are successfully inserted

	// retrieve data from queue
	LData ret_d = retrieveQ(myq);
	printf("retrieved data) ");
	printStudent(&ret_d);
	printf("\n");
	printQ(myq); // check if the retrieved data is successfully deleted

	// destroy queue
	destroyQ(myq);

	return 0;

}

결과

 

 

 

'컴퓨터기본 > 자료구조' 카테고리의 다른 글

6. Binary Search Tree  (0) 2021.06.14
5. Doubly Linked List  (0) 2021.06.14
4. General Linear Lists  (0) 2021.06.14
2. Stack (Linked list)  (0) 2021.06.14
1. 재귀, ADT  (0) 2021.06.14