[카테고리:] <span>자료구조와 알고리즘</span>

앞에서 만든 동적 배열이 잘 동작하는지 확인하는 시뮬레이션 코드를 작성합시다. 여기에서는 순차적으로 자료를 보관하는 예와 특정 키순으로 보관하는 예, 인덱스를 사용하는 예를 들게요.

int main()
{
    Simul_Seq();
    Simul_Order();
    Simul_Index();
    return 0;
}

먼저 순차적으로 동적 배열을 사용하는 시뮬레이션 코드를 작성합시다.

void Simul_Seq()
{

먼저 동적 배열을 생성합니다.

    Array *arr = New_Array();

그리고 도서 개체를 생성하여 순차적으로 동적 배열에 보관합니다.

    Array_PushBack(arr,New_Book("C언어","홍길동",10));
    Array_PushBack(arr,New_Book("C++언어","강감찬",20));
    Array_PushBack(arr,New_Book("자료구조","김구",5));
    Array_PushBack(arr,New_Book("알고리즘","이순신",9));
    Array_PushBack(arr,New_Book("디자인패턴","정약용",13));

동적 배열에 있는 내용을 확인합니다. 이 부분은 별도의 함수로 작성합시다.

    View_Array(arr);

그리고 보관한 도서를 찾아 봅시다. 이 부분도 별도의 함수로 작성할게요. 이 함수는 동적 배열과 검색할 도서 제목을 입력 인자로 전달할게요. 테스트를 위해 보관한 도서와 보관하지 않은 도서를 검색해 봅시다.

    Simul_Find(arr,"C언어");
    Simul_Find(arr,"이데아이론");

이번에는 보관한 자료를 삭제합시다. 이 부분도 별도의 함수로 작성할게요.

    Simul_Remove(arr,"자료구조");

동적 배열에 보관한 목록을 출력하여 잘 삭제하였는지 확인합니다.

    View_Array(arr);

마지막으로 시뮬레이션에 사용한 개체들을 정리합니다. 이 부분도 별도의 함수로 작성합시다.

    SimulEnd(arr);
}

먼저 동적 배열에 보관한 도서 목록을 출력하는 함수를 작성합시다.

void View_Array(Array *arr)
{
    Book *book = 0;

동적 배열에 자료를 보관한 시작 위치와 마지막 다음 위치를 얻어옵니다.

    Iterator seek = Array_Begin(arr);
    Iterator end = Array_End(arr);

위치를 점진적으로 이동하면서 전체 목록을 출력해야 합니다.

    printf("-----보유 도서 목록-----\n");
    for(   ;seek!=end;seek++)
    {

현재 위치의 도서 정보를 참조합니다. 여기에서는 도서 개체를 보관하였으므로 이에 맞게 형변환합니다.

        book = (Book *)(*seek);

해당 위치에 보관한 도서 개체가 유효하면 도서 정보를 출력합니다.

        if(book)
        {
            Book_View(book);
        }
    }

도서 제목으로 동적 배열에 보관한 도서를 검색하는 함수를 작성합시다.

void Simul_Find(Array *arr,const char *title)
{
    Book *book = 0;

동적 배열에서 검색할 구간의 시작과 끝을 얻어옵니다.

    Iterator seek = Array_Begin(arr);
    Iterator end = Array_End(arr);

순차적으로 이동하면서 검색합니다.

    for(   ;seek!=end;seek++)
    {

현재 위치의 도서 개체를 얻어옵니다.

        book = (Book *)(*seek);

도서 개체가 유효하면 도서 제목이 차이가 없는지 확인합니다.

        if(book && (Book_CompareTitle(book,title)==0))
        {

찾았으면 도서 정보를 출력하고 함수를 종료합니다.

            printf("검색 결과:");
            Book_View(book);
            return;
        }
    }

만약 순차적으로 이동하면서 검색하여도 발견하지 못하면 이를 통보합니다.

    printf("<%s> 책을 찾을 수 없습니다.\n",title);
}

도서 제목으로 동적 배열에 보관한 도서를 삭제하는 함수를 작성합시다.

void Simul_Remove(Array *arr,const char *title)
{
    Book *book = 0;

삭제할 도서를 찾는 로직은 검색하는 부분과 비슷합니다.

    Iterator seek = Array_Begin(arr);
    Iterator end = Array_End(arr);
    for(   ;seek!=end;seek++)
    {
        book = (Book *)(*seek);
        if(book && (Book_CompareTitle(book,title)==0))
        {

차이점은 찾은 위치의 내용을 배열에서 제거한다는 것입니다.

            Array_Erase(arr,seek);

그리고 해당 도서를 소멸할게요.

            Delete_Book(book);
            printf("삭제 성공!\n");
            return;
        }
    }
    printf("<%s> 책을 찾을 수 없습니다.\n",title);
}

시뮬레이션을 마치면서 동적으로 생성한 개체를 소멸하는 함수를 작성합시다.

void SimulEnd(Array *arr)
{
    Book *book = 0;

검색과 삭제를 할 때처럼 동적 배열을 순차적으로 이동하면서 도서 개체를 참조합니다.

    Iterator seek = Array_Begin(arr);
    Iterator end = Array_End(arr);
    for(   ;seek!=end;seek++)
    {
        book = (Book *)(*seek);

만약 도서 개체가 유효하면 도서 개체를 소멸합니다.

        if(book)
        {
            Delete_Book(book);
        }
    }

마지막으로 동적 배열도 소멸합니다.

    Delete_Array(arr);
}

이번에는 특정 키순으로 자료를 보관하는 시뮬레이션 함수를 작성합시다.

void Simul_Order()
{

먼저 동적 배열을 생성합니다.

   Array *arr = New_Array();

여기에서는 지은이 순으로 보관하는 것으로 할게요. 그리고 보관할 위치를 찾아 보관하는 함수는 별도의 함수로 작성합시다.

    Simul_OrderAdd(arr,New_Book("C언어","홍길동",10));
    Simul_OrderAdd(arr,New_Book("C++언어","강감찬",20));
    Simul_OrderAdd(arr,New_Book("자료구조","김구",5));
    Simul_OrderAdd(arr,New_Book("알고리즘","이순신",9));
    Simul_OrderAdd(arr,New_Book("디자인패턴","정약용",13));

확인하기 위해 동적 배열에 보관한 도서 목록을 출력합니다.

    View_Array(arr);

검색과 삭제 기능은 순차 보관할 때와 차이가 없습니다.

    Simul_Find(arr,"C언어");
    Simul_Find(arr,"이데아이론");
    Simul_Remove(arr,"자료구조");
    View_Array(arr);
    SimulEnd(arr);
}

지은이 순으로 도서를 보관하는 함수를 작성합시다.

void Simul_OrderAdd(Array *arr,Book *book)
{
    Book *stored_book = 0;

보관할 위치를 찾기 위해 구간의 시작과 끝을 구합니다.

    Iterator seek = Array_Begin(arr);
    Iterator end = Array_End(arr);

순차적으로 이동하면서 보관한 도서 개체를 구합니다.

    for(   ;seek!=end;seek++)
    {
        stored_book = (Book *)(*seek);

보관한 도서 개체와 추가할 도서 개체의 지은이를 비교하여 보관한 도서 개체의 값이 크거나 같으면 위치를 찾은 것입니다.

        if(stored_book && (Book_CompareAuthor(stored_book,book->author)>=0))
        {
            break;
        }
    }

찾은 위치에 도서를 보관합니다.

    Array_Insert(arr,seek,book);
}

마지막으로 인덱스로 보관하는 시뮬레이션 함수를 작성합시다.

void Simul_Index()
{

먼저 동적 배열을 생성합니다.

    Array *arr = New_Array();

인덱스로 사용할 때는 최대 보관할 수 있는 개수 만큼을 디폴트 값으로 설정합니다. 여기에서는 최대 100으로 하고 디폴트 값을 0으로 설정할게요.

    Array_SetSize(arr,100,0);

그리고 특정 인덱스에 보관한 내용을 변경하는 함수를 이용하여 도서 개체를 보관합니다. 보관할 위치는 도서 번호 – 1 인덱스에 보관하는 것으로 할게요.

    Array_SetAt(arr,9,New_Book("C언어","홍길동",10));
    Array_SetAt(arr,19,New_Book("C++언어","강감찬",20));
    Array_SetAt(arr,4,New_Book("자료구조","김구",5));
    Array_SetAt(arr,8,New_Book("알고리즘","이순신",9));
    Array_SetAt(arr,12,New_Book("디자인패턴","정약용",13));

원하는 대로 보관하는지 확인합니다.

    View_Array(arr);

도서 번호로 검색합시다. 이 부분은 별도의 함수로 작성할게요. 보관한 도서와 보관하지 않은 도서 번호를 확인합니다.

    Simul_FindNum(arr,20);
    Simul_FindNum(arr,21);

도서 번호로 보관한 도서를 삭제합니다. 이 부분도 별도의 함수로 작성할게요.

    Simul_RemoveNum(arr,9);

삭제 동작이 정상적인지 확인하기 위해 전체 정보를 출력합니다.

    View_Array(arr);
    SimulEnd(arr);
}

도서 번호로 검색하는 함수를 작성합시다.

void Simul_FindNum(Array *arr,int bnum)
{
    Book *book = 0;

도서 번호 -1 인덱스에 보관한 도서 개체를 얻어옵니다.

    book = (Book *)Array_GetAt(arr,bnum-1);

만약 유효하면 검색 성공한 것입니다.

    if(book)
    {
        printf("검색 결과:");
        Book_View(book);
    }

그렇지 않다면 실패한 것입니다.

    else
    {
        printf("<%d>번 책을 찾을 수 없습니다.\n",bnum);
    }
}

도서 번호로 보관한 도서 개체를 삭제하는 함수를 작성합시다.

void Simul_RemoveNum(Array *arr,int bnum)
{
    Book *book = 0;

먼저 도서 번호 -1 인덱스의 도서를 구합니다.

    book = (Book *)Array_GetAt(arr,bnum-1);

만약 유효하면 도서가 있는 것입니다.

    if(book)
    {

이 때는 도서 개체를 소멸합니다.

        Delete_Book(book);

그리고 해당 인덱스에 0으로 보관한 값을 설정합니다.

         Array_SetAt(arr,bnum-1,0);
    }

유효하지 않으면 해당 번호의 도서는 없는 것입니다.

    else
    {
        printf("<%d>번 책을 찾을 수 없습니다.\n",bnum);
    }
}

이상으로 동적 배열의 테스트를 마칠게요.

//Program.c
#include "Array.h"
#include "Book.h"
void View_Array(Array *arr)
{
    Book *book = 0;
    Iterator seek = Array_Begin(arr);
    Iterator end = Array_End(arr);
    
    printf("-----보유 도서 목록-----\n");
    for(   ;seek!=end;seek++)
    {
        book = (Book *)(*seek);
        if(book)
        {
            Book_View(book);
        }
    }	
}
void SimulEnd(Array *arr)
{
    Book *book = 0;
    Iterator seek = Array_Begin(arr);
    Iterator end = Array_End(arr);
    
    for(   ;seek!=end;seek++)
    {
        book = (Book *)(*seek);
        if(book)
        {
            Delete_Book(book);
        }
    }
    Delete_Array(arr);
}
void Simul_Find(Array *arr,const char *title)
{
    Book *book = 0;
    Iterator seek = Array_Begin(arr);
    Iterator end = Array_End(arr);
    
    for(   ;seek!=end;seek++)
    {
        book = (Book *)(*seek);
        if(book && (Book_CompareTitle(book,title)==0))
        {
            printf("검색 결과:");
            Book_View(book);
            return;
        }
    }
    printf("<%s> 책을 찾을 수 없습니다.\n",title);
}
void Simul_Remove(Array *arr,const char *title)
{
    Book *book = 0;
    Iterator seek = Array_Begin(arr);
    Iterator end = Array_End(arr);
    
    for(   ;seek!=end;seek++)
    {
        book = (Book *)(*seek);
        if(book && (Book_CompareTitle(book,title)==0))
        {
            Array_Erase(arr,seek);
            Delete_Book(book);
            printf("삭제 성공!\n");
            return;
        }
    }
    printf("<%s> 책을 찾을 수 없습니다.\n",title);
}
void Simul_Seq()
{
    Array *arr = New_Array();
    Array_PushBack(arr,New_Book("C언어","홍길동",10));
    Array_PushBack(arr,New_Book("C++언어","강감찬",20));
    Array_PushBack(arr,New_Book("자료구조","김구",5));
    Array_PushBack(arr,New_Book("알고리즘","이순신",9));
    Array_PushBack(arr,New_Book("디자인패턴","정약용",13));
    View_Array(arr);
    Simul_Find(arr,"C언어");
    Simul_Find(arr,"이데아이론");
    Simul_Remove(arr,"자료구조");
    View_Array(arr);
    SimulEnd(arr);	
}

void Simul_OrderAdd(Array *arr,Book *book)
{	
    Book *stored_book = 0;
    Iterator seek = Array_Begin(arr);
    Iterator end = Array_End(arr);
    
    for(   ;seek!=end;seek++)
    {
        stored_book = (Book *)(*seek);
        if(stored_book && (Book_CompareAuthor(stored_book,book->author)>=0))
        {
            break;
        }
    }	
    Array_Insert(arr,seek,book);
}
void Simul_Order()
{
    Array *arr = New_Array();
    
    Simul_OrderAdd(arr,New_Book("C언어","홍길동",10));
    Simul_OrderAdd(arr,New_Book("C++언어","강감찬",20));
    Simul_OrderAdd(arr,New_Book("자료구조","김구",5));
    Simul_OrderAdd(arr,New_Book("알고리즘","이순신",9));
    Simul_OrderAdd(arr,New_Book("디자인패턴","정약용",13));
    View_Array(arr);
    Simul_Find(arr,"C언어");
    Simul_Find(arr,"이데아이론");
    Simul_Remove(arr,"자료구조");
    View_Array(arr);
    SimulEnd(arr);
}

void Simul_FindNum(Array *arr,int bnum)
{
    Book *book = 0;
    book = (Book *)Array_GetAt(arr,bnum-1);
    if(book)
    {
        printf("검색 결과:");
        Book_View(book);			
    }
    else
    {
        printf("<%d>번 책을 찾을 수 없습니다.\n",bnum);
    }
}
void Simul_RemoveNum(Array *arr,int bnum)
{	
    Book *book = 0;
    book = (Book *)Array_GetAt(arr,bnum-1);
    if(book)
    {		
        Delete_Book(book);			
        Array_SetAt(arr,bnum-1,0);
    }
    else
    {
        printf("<%d>번 책을 찾을 수 없습니다.\n",bnum);
    }
}
void Simul_Index()
{
    Array *arr = New_Array();
    Array_SetSize(arr,100,0);	
    Array_SetAt(arr,9,New_Book("C언어","홍길동",10));
    Array_SetAt(arr,19,New_Book("C++언어","강감찬",20));
    Array_SetAt(arr,4,New_Book("자료구조","김구",5));
    Array_SetAt(arr,8,New_Book("알고리즘","이순신",9));
    Array_SetAt(arr,12,New_Book("디자인패턴","정약용",13));
    View_Array(arr);
    Simul_FindNum(arr,20);
    Simul_FindNum(arr,21);	
    Simul_RemoveNum(arr,9);
    View_Array(arr);
    SimulEnd(arr);
}
int main()
{
    Simul_Seq();
    Simul_Order();
    Simul_Index();
    return 0;
}

자료구조와 알고리즘