언어 자료구조 알고리즘/[C]디딤돌 자료구조와 알고리즘

[디딤돌 자료구조와 알고리즘] 5.3.2 큐 구현 , 5.3.3 큐 테스트

언제나휴일 2016. 5. 23. 17:07
반응형

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 큐(QUEUE)

[디딤돌 자료구조와 알고리즘] 5.3.1 큐(QUEUE) 설계


실습한 소스 및 헤더 파일

큐.zip


다양한 큐 구현

[언어 자료구조 알고리즘/C언어 예제] - 원형 큐 - 버퍼 크기 고정, 정수 보관, C언어 소스

[언어 자료구조 알고리즘/C언어 예제] - 원형 큐 - 모든 공간 사용, 정수 보관, C언어 소스

[언어 자료구조 알고리즘/C언어 예제] - 원형 큐 - 버퍼 공간을 동적으로 생성, 정수 보관, C 언어 소스

[언어 자료구조 알고리즘/C언어 예제] - 원형 큐 - 동적 생성, 정수 보관, C언어 소스

[언어 자료구조 알고리즘/C언어 예제] - 원형 큐 - 버퍼 자동으로 확장, 정수 보관, C언어 소스

[언어 자료구조 알고리즘/C언어 예제] - 원형 큐 - 버퍼 공간 자동으로 할당, 동적 데이터 보관, C언어 소스

[언어 자료구조 알고리즘/C언어 예제] - 큐 - 연결리스트 이용, C언어 소스

3.4 큐(Queue) [디딤돌 자료구조와 알고리즘 with C++]

3.5 큐를 이용한 스케쥴러 시뮬레이션 [디딤돌 자료구조와 알고리즘 with C++]



반응형