5.3.2 큐 구현, 5.3.3 큐 테스트
5.3.2 큐 구현
먼저 동적으로 큐를 생성하는 함수를 작성합시다.
EHQueue *New_EHQueue()
{
여기서 설계한 큐는 연결 리스트이므로 연결리스트를 동적으로 생성하여 반환합니다. 이처럼 이미 작성한 기능을 이용하여 전달하는 역할만 하는 함수를 래퍼(Wrapper) 함수라고 부릅니다.
return New_LinkedList();
}
동적으로 생성한 큐를 소멸하는 함수도 래퍼 함수로 작성합니다.
void Delete_EHQueue(EHQueue *ehq)
{
Delete_LinkedList(ehq);
}
큐에 자료를 보관하는 함수도 연결리스트에 순차 보관하는 함수를 호출하는 래퍼 함수로 작성합니다.
void EHQueue_Put(EHQueue *ehq, Element data)
{
LinkedList_PushBack(ehq,data);
}
큐에서 자료를 꺼내는 함수를 작성합시다.
Element EHQueue_Get(EHQueue *ehq)
{
Element element = 0;
만약 큐가 비어있지 않을 때 처리할 코드를 작성합시다.
if( ! EHQueue_IsEmpty(ehq))
{
연결리스트에 처음 보관한 자료를 가진 노드의 위치 정보를 얻어옵니다.
Link first = LinkedList_Begin(ehq);
그리고 그 위치의 보관한 자료를 반환할 element에 설정합니다.
element = first->data;
이제 해당 노드를 연결리스트에서 제거합니다.
LinkedList_Erase(ehq,first);
}
element를 반환합니다.
return element;
}
큐가 비었는지 확인하는 함수는 연결리스트의 usage 멤버 값이 0인지 확인한 결과를 반환합니다.
int EHQueue_IsEmpty(EHQueue *ehq){ return ehq->usage == 0; }
▷EHQueue.c
//EHQueue.c
#include "EHQueue.h"
EHQueue *New_EHQueue()
{
return New_LinkedList();
}
void Delete_EHQueue(EHQueue *ehq)
{
Delete_LinkedList(ehq);
}
void EHQueue_Put(EHQueue *ehq, Element data)
{
LinkedList_PushBack(ehq,data);
}
Element EHQueue_Get(EHQueue *ehq)
{
Element element = 0;
if( ! EHQueue_IsEmpty(ehq))
{
Link first = LinkedList_Begin(ehq);
element = first->data;
LinkedList_Erase(ehq,first);
}
return element;
}
int EHQueue_IsEmpty(EHQueue *ehq)
{
return ehq->usage == 0;
}
5.3.3 큐 테스트
큐를 테스트하는 코드를 작성합시다.
int main()
{
EHQueue *ehq = 0;
Book *book = 0;
먼저 동적으로 큐를 생성합니다.
ehq = New_EHQueue();
그리고 큐에 자료를 보관합니다.
EHQueue_Put(ehq,New_Book("C언어","홍길동",10));
EHQueue_Put(ehq,New_Book("C++언어","강감찬",20));
EHQueue_Put(ehq,New_Book("자료구조","김구",5));
이 상태에서 꺼내면 가장 먼저 보관한 "C언어" 제목의 도서여야 합니다. 이를 확인해 봅시다.
book = (Book *)EHQueue_Get(ehq);
if(book)
{
Book_View(book);
Delete_Book(book);
}
두 개의 도서를 더 보관할게요.
EHQueue_Put(ehq,New_Book("알고리즘","이순신",9));
EHQueue_Put(ehq,New_Book("디자인패턴","정약용",13));
큐가 비지 않으면 반복해서 꺼내와 도서 정보를 출력합시다. 제대로 작성했다면 "C++언어", "자료구조", "알고리즘", "디자인패턴" 순으로 출력할 것입니다.
while( ! EHQueue_IsEmpty(ehq))
{
book = (Book *)EHQueue_Get(ehq);
if(book)
{
Book_View(book);
Delete_Book(book);
}
}
마지막으로 큐를 소멸합니다.
Delete_EHQueue(ehq);
return 0;
}
관련 게시글
[디딤돌 자료구조와 알고리즘] 5.3.1 큐(QUEUE) 설계
실습한 소스 및 헤더 파일
다양한 큐 구현
[언어 자료구조 알고리즘/C언어 예제] - 원형 큐 - 버퍼 크기 고정, 정수 보관, C언어 소스
[언어 자료구조 알고리즘/C언어 예제] - 원형 큐 - 모든 공간 사용, 정수 보관, C언어 소스
[언어 자료구조 알고리즘/C언어 예제] - 원형 큐 - 버퍼 공간을 동적으로 생성, 정수 보관, C 언어 소스
[언어 자료구조 알고리즘/C언어 예제] - 원형 큐 - 동적 생성, 정수 보관, C언어 소스
[언어 자료구조 알고리즘/C언어 예제] - 원형 큐 - 버퍼 자동으로 확장, 정수 보관, C언어 소스
[언어 자료구조 알고리즘/C언어 예제] - 원형 큐 - 버퍼 공간 자동으로 할당, 동적 데이터 보관, C언어 소스
[언어 자료구조 알고리즘/C언어 예제] - 큐 - 연결리스트 이용, C언어 소스
3.4 큐(Queue) [디딤돌 자료구조와 알고리즘 with C++]
3.5 큐를 이용한 스케쥴러 시뮬레이션 [디딤돌 자료구조와 알고리즘 with C++]
'언어 자료구조 알고리즘 > [C]디딤돌 자료구조와 알고리즘' 카테고리의 다른 글
[디딤돌 자료구조와 알고리즘] 5.4.1 스택 설계, 5.4.2 스택 구현, 5.4.3 스택 테스트 (0) | 2016.05.23 |
---|---|
[디딤돌 자료구조와 알고리즘] 5.4 스택 (STACK) (0) | 2016.05.23 |
[디딤돌 자료구조와 알고리즘] 5.3.1 큐(QUEUE) 설계 (0) | 2016.05.23 |
[디딤돌 자료구조와 알고리즘] 5.3 큐(QUEUE) (0) | 2016.05.23 |
[디딤돌 자료구조와 알고리즘] 5.2 연결리스트 - 5.2.3 연결리스트 테스트 (0) | 2016.05.16 |
[디딤돌 자료구조와 알고리즘] 5.2 연결리스트 - 5.2.2 연결리스트 구현 (0) | 2016.05.16 |
[디딤돌 자료구조와 알고리즘] 5.2 연결리스트 - 5.2.1 연결리스트 설계 (0) | 2016.05.16 |
[디딤돌 자료구조와 알고리즘] 5.1 배열 - 5.1.3 동적 배열 테스트 (0) | 2016.05.16 |
[디딤돌 자료구조와 알고리즘] 5.1 배열 - 5.1.2 동적 배열 구현 (0) | 2016.05.16 |
[디딤돌 자료구조와 알고리즘] 5.1 배열 - 5.1.1 동적 배열 설계 (0) | 2016.05.16 |