5.1.4 동적 배열 소스 코드

//common.h
#pragma once //헤더 파일을 한 번만 포함해서 컴파일
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <malloc.h>
#include <memory.h>
#include <time.h>
#pragma warning(disable:4996) //4996컴파일 경고 메시지 출력 해제
//Book.h
#pragma once
#include "common.h"
#define MAX_TIT_LEN	200
#define MAX_AUT_LEN 20
typedef struct _Book Book;
struct _Book
{
    char title[MAX_TIT_LEN+1];
    char author[MAX_AUT_LEN+1];
    int num;
};

Book *New_Book(const char *title,const char *author,int num);
void Delete_Book(Book *book);
void Book_View(Book *book);
int Book_CompareTitle(Book *book,const char *title);
int Book_CompareAuthor(Book *book,const char *author);
int Book_CompareNum(Book *book,int num);
//Book.c
#include "Book.h"

void Book_Book(Book *book,const char *title,const char *author,int num);
Book *New_Book(const char *title,const char *author,int num)
{
	Book *book = 0;
	book = (Book *)malloc(sizeof(Book));
	Book_Book(book,title,author,num);
	return book;
}
void Book_Book(Book *book,const char *title,const char *author,int num)
{
	memset(book,0,sizeof(Book));
	strncpy(book->title,title,MAX_TIT_LEN);
	strncpy(book->author,author,MAX_AUT_LEN);
	book->num = num;
}
void Delete_Book(Book *book)
{
	free(book);
}
void Book_View(Book *book)
{
	printf("<%010d>:<%s>\n",book->num,book->title);
	printf("\t 저자:%s\n",book->author);
}
int Book_CompareTitle(Book *book,const char *title)
{
	return strcmp(book->title,title);
}
int Book_CompareAuthor(Book *book,const char *author)
{
	return strcmp(book->author,author);
}
int Book_CompareNum(Book *book,int num)
{
	return book->num-num;
}
//Array.h
#pragma once
typedef void * Element;
typedef struct _Array Array;
struct _Array
{
    Element *base;
    int capacity;
    int usage;
};
typedef Element *Iterator;

Array *New_Array();
void Delete_Array(Array *arr);
void Array_SetSize(Array *arr,int capacity,Element data);
void Array_PushBack(Array *arr,Element data);
void Array_Insert(Array *arr,Iterator pos,Element data);
void Array_SetAt(Array *arr,int index,Element data);
Element Array_GetAt(Array *arr,int index);
Iterator Array_Begin(Array *arr);
Iterator Array_End(Array *arr);
void Array_Erase(Array *arr,Iterator pos);
//Array.c
#include "Array.h"
#include <malloc.h>
#include <memory.h>
Array *New_Array()
{
    Array *arr = 0;
    arr = (Array *)malloc(sizeof(Array));
    arr->base = 0;
    arr->capacity = arr->usage = 0;
    return arr;
}
void Delete_Array(Array *arr)
{
    if(arr->base)
    {
        free(arr->base);
    }
    free(arr);
}
void Array_SetSize(Array *arr,int capacity,Element data)
{	
    arr->capacity = capacity;
    arr->base = (Element *)realloc(arr->base,sizeof(Element)*arr->capacity);
    for(    ;arr->usage<arr->capacity; arr->usage++)
    {
        arr->base[arr->usage] = data;
    }
}
void Array_PushBack(Array *arr,Element data)
{
    Iterator at = Array_End(arr);
    Array_Insert(arr,at,data);
}
void Array_Insert(Array *arr,Iterator pos,Element data)
{
    int index = pos - arr->base;
    int mcount = arr->usage - index;
    if(arr->capacity == arr->usage)
    {
        if(arr->capacity)
        {
            arr->capacity*=2;
        }
        else
        {
            arr->capacity = 1;
        }
        arr->base = (Element *)realloc(arr->base,sizeof(Element)*arr->capacity);
    }
    memcpy(arr->base+index+1,arr->base+index,sizeof(Element)*mcount);
    arr->base[index] = data;
    arr->usage++;
}
void Array_SetAt(Array *arr,int index,Element data)
{
    if((index>=0)&&(index<arr->usage))
    {
        arr->base[index] = data;
    }
}
Element Array_GetAt(Array *arr,int index)
{
    if((index>=0)&&(index<arr->usage))
    {
        return arr->base[index];
    }
    return 0;
}
Iterator Array_Begin(Array *arr)
{
    return arr->base;
}
Iterator Array_End(Array *arr)
{
    return arr->base+arr->usage;
}
void Array_Erase(Array *arr,Iterator pos)
{
    int index = pos - arr->base;
    int mcount = arr->usage - index -1;
    memcpy(pos,pos+1,sizeof(Element)*mcount);
    arr->usage--;
}
//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;
}