언어 자료구조 알고리즘/디딤돌 자료구조 (C언어)

[C언어 자료구조] 1.2 공통으로 사용할 코드

언제나휴일 2016. 11. 26. 12:49
반응형

[C언어 자료구조] 1.2 공통으로 사용할 코드


앞으로 이 책에서 공통으로 사용할 소스를 먼저 소개할게요. 같은 부분을 계속 지면을 할애하는 것보다 앞에서 언급하고 넘어갈게요.

 

이 책에서 공통으로 사용할 Book 형식을 정의합시다. Book 형식에는 제목, 저자, 번호를 멤버로 구성하세요.

#pragma once

 

#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을 생성하는 함수와 소멸하는 함수를 제공합시다.

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);

 

그리고 자주 사용할 헤더파일 포함문을 추가하세요.

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <time.h>

 

다음은 Book.h 파일의 내용입니다.

Book.h

//Book.h

#pragma once

 

#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);

 

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <time.h>

 

이제 book.c 소스 파일에 제공할 함수를 구체적으로 구현합시다.

 

 먼저 동적으로 도서 개체를 생성하는 함수를 구현합시다. 이 함수에서는 먼저 생성할 도서 개체를 위한 메모리를 동적으로 할당합니다. 그리고 생성하면서 초기화한후에 생성한 메모리를 반환합니다. 앞으로 생성한 개체의 메모리를 초기값으로 설정하는 부분은 별도의 함수를 호출해서 구현하는 것으로 할게요. 그리고 생성한 개체를 초기화하는 함수이름은 형식명_형식명으로 할게요.

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_s(book->title, MAX_TIT_LEN, title, MAX_TIT_LEN);

    strncpy_s(book->author, MAX_AUT_LEN, 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;

}

 

다음은 작성한 Book.c 소스 파일의 내용입니다.

Book.c

//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_s(book->title,MAX_TIT_LEN,title,MAX_TIT_LEN);

    strncpy_s(book->author,MAX_AUT_LEN,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;

}

 

반응형