C언어/디딤돌 C언어 예제

[C언어 소스] 사용자 정의 동적 배열(인덱스로 보관)

언제나휴일 2016. 12. 3. 10:40
반응형

[C언어 소스] 사용자 정의 동적 배열(인덱스로 보관)


사용자 정의 배열.zip



//Member.h

#pragma once

typedef struct _Member Member;

#define MAX_NAME_LEN 20

struct _Member

{

    int mnum;

    char name[MAX_NAME_LEN];

};

 

Member *New_Member(int mnum, const char *name);

void Delete_Member(Member *member);

int Member_GetNum(Member *member);

const char *Member_GetName(Member *member);

void Member_View(Member *member); 


//Member.c

#include "Member.h"

#include <stdlib.h>

#include <string.h>

#include <stdio.h>

void Member_Member(Member *member, int mnum, const char *name);

Member *New_Member(int mnum, const char *name)

{

    Member *member = 0;

    member = (Member *)malloc(sizeof(Member));

    Member_Member(member, mnum, name);

    return member;

}

void Member_Member(Member *member, int mnum, const char *name)

{

    strcpy_s(member->name, MAX_NAME_LEN, name);

    member->mnum = mnum;

}

void Delete_Member(Member *member)

{

    free(member);

}

int Member_GetNum(Member *member)

{

    return member->mnum;

}

const char *Member_GetName(Member *member)

{

    return member->name;

}

void Member_View(Member *member)

{

    printf("회원 번호:%d 회원 이름:%s\n", member->mnum, member->name);

}



//EHArray.h

#pragma once

 

typedef struct _EHArray EHArray;

typedef void * Element;

typedef Element * Iterator;

struct _EHArray

{

    Element *base;

    int capacity; //저장소의 크기

    int size; //보관한 요소 개수

};

 

EHArray *New_EHArray(int icapa, Element ivalue);

void Delete_EHArray(EHArray *eharr);

int EHArray_GetCapacity(EHArray *eharr);

int EHArray_GetSize(EHArray *eharr);

void EHArray_PushBack(EHArray *eharr, Element data);

Element EHArray_GetAt(EHArray *eharr, int index);

void EHArry_SetAt(EHArray *eharr, int index, Element data);

Iterator EHArray_Begin(EHArray *eharr);

Iterator EHArray_End(EHArray *eharr);

void EHArray_Erase(EHArray *eharr, Iterator it);

 


//EHArray.c

#include "EHArray.h"

#include <stdlib.h>

void EHArray_EHArray(EHArray *eharr, int icapa, Element ivalue);

EHArray *New_EHArray(int icapa, Element ivalue)

{

    EHArray *eharr = 0;

    eharr = (EHArray *)malloc(sizeof(EHArray));

    EHArray_EHArray(eharr, icapa, ivalue);

    return eharr;

}

void EHArray_Reserve(EHArray *eharr, int icapa);

void EHArray_PushBacks(EHArray *eharr, int icapa, Element ivalue);

void EHArray_EHArray(EHArray *eharr, int icapa, Element ivalue)

{

    eharr->base = 0;

    eharr->capacity = 0;

    eharr->size = 0;

    if (icapa > 0)

    {

        EHArray_Reserve(eharr, icapa);

        EHArray_PushBacks(eharr, icapa, ivalue);

    }

}

void EHArray_Reserve(EHArray *eharr, int icapa)

{

    eharr->base = (Element *)realloc(eharr->base, sizeof(Element)*icapa);

    eharr->capacity = icapa;

}

void EHArray_PushBacks(EHArray *eharr, int icapa, Element ivalue)

{

    int i = 0;

    for (i = 0; i < icapa; i++)

    {

        EHArray_PushBack(eharr, ivalue);

    }

}

void EHArray_TEHArray(EHArray *eharr);

void Delete_EHArray(EHArray *eharr)

{

    EHArray_TEHArray(eharr);

    free(eharr);

}

void EHArray_TEHArray(EHArray *eharr)

{

    free(eharr->base);

}

int EHArray_GetCapacity(EHArray *eharr)

{

    return eharr->capacity;

}

int EHArray_GetSize(EHArray *eharr)

{

    return eharr->size;

}

void EHArray_PushBack(EHArray *eharr, Element data)

{

    if (eharr->capacity == eharr->size)

    {

        if (eharr->capacity)

        {

            EHArray_Reserve(eharr, eharr->capacity * 2);

        }

        else

        {

            EHArray_Reserve(eharr, 1);

        }

    }

    eharr->base[eharr->size] = data;

    eharr->size++;

}

Element EHArray_GetAt(EHArray *eharr, int index)

{

    if ((index >= 0) && (index < eharr->size))

    {

        return eharr->base[index];

    }

    return 0;

}

void EHArry_SetAt(EHArray *eharr, int index, Element data)

{

    if ((index >= 0) && (index < eharr->size))

    {

        eharr->base[index] = data;

    }

}

Iterator EHArray_Begin(EHArray *eharr)

{

    return eharr->base;

}

Iterator EHArray_End(EHArray *eharr)

{

    return eharr->base + eharr->size;

}

void EHArray_Erase(EHArray *eharr, Iterator it)

{

    Iterator end;

    eharr->size--;

    end = eharr->base + eharr->size;

    for (; it != end; it++)

    {

        *it = *(it + 1);

    }

}

 


//디딤돌 C언어 http://ehpub.co.kr

//88. 사용자 정의 배열 개요

//89. 동적 배열 헤더 작성

//90. 동적 배열 소스 작성

//91. 동적 배열 사용 예 - 동적 개체 정의

//92. 동적 배열 사용 예 - 순차 보관

//93. 동적 배열 사용 예 - 인덱스로 보관

 

#include "EHArray.h"

#include "Member.h"

#include <stdio.h>

 

void ExampleSeq();

int main()

{

    ExampleIndex();

    return 0;

}

void InputSeq(EHArray *arr);

void ViewSeq(EHArray *arr);

void EndSeq(EHArray *arr);

void ExampleSeq()

{

    EHArray *arr = 0;

    arr = New_EHArray(0, 0);

    InputSeq(arr);

    InputSeq(arr);

    InputSeq(arr);

    ViewSeq(arr);

    EndSeq(arr);

}

Member *MakeMember(int mnum)

{

    char name[MAX_NAME_LEN] = "";

    printf("%d번의 회원 이름:",mnum);

    scanf_s("%s", name, MAX_NAME_LEN);

    return New_Member(mnum, name);

}


void EndSeq(EHArray *arr)

{

    Iterator seek;

    Iterator last;

    Member *member = 0;

    seek = EHArray_Begin(arr);

    last = EHArray_End(arr);

    for (; seek != last; ++seek)

    {

        member = (Member *)(*seek);

        Delete_Member(member);

    }

    Delete_EHArray(arr);

}

void InputIndex(EHArray *arr);

void ViewIndex(EHArray *arr);

void EndIndex(EHArray *arr);

void ExampleIndex()

{

    EHArray *arr = 0;

    int max = 0;

    printf("최대 관리할 회원 수를 입력:");

    scanf_s("%d", &max);

    arr = New_EHArray(max, 0);

    InputIndex(arr);

    InputIndex(arr);

    InputIndex(arr);

    ViewIndex(arr);

    EndIndex(arr);

}

void InputIndex(EHArray *arr)

{

    int mnum = 0;

    Member *member = 0;

    printf("생성할 회원 번호(1~%d):",EHArray_GetSize(arr));

    scanf_s("%d", &mnum);

    if ((mnum >= 1) && (mnum <= EHArray_GetSize(arr)))

    {

        if (EHArray_GetAt(arr,mnum-1))

        {

            printf("%d번의 회원 데이터는 이미 있습니다.\n", mnum);

        }

        else

        {

            member = MakeMember(mnum);

            EHArry_SetAt(arr, mnum - 1, member);

        }       

    }

    else

    {

        printf("%d번은 유효한 번호가 아닙니다.\n", mnum);

    }   

}

void ViewIndex(EHArray *arr)

{

    int max = 0;

    int i = 0;

    Member *member = 0;

    max = EHArray_GetSize(arr);

    for (i = 0; i < max; i++)

    {

        member = (Member *)EHArray_GetAt(arr, i);

        if (member)

        {

            Member_View(member);

        }

    }

}

void EndIndex(EHArray *arr)

{

    int max = 0;

    int i = 0;

    Member *member = 0;

    max = EHArray_GetSize(arr);

    for (i = 0; i < max; i++)

    {

        member = (Member *)EHArray_GetAt(arr, i);

        if (member)

        {

            Delete_Member(member);

        }

    }

    Delete_EHArray(arr);

}

 


실행 결과

최대 관리할 회원 수를 입력:3

생성할 회원 번호(1~3):2

2번의 회원 이름:홍길동

생성할 회원 번호(1~3):3

3번의 회원 이름:김구

생성할 회원 번호(1~3):1

1번의 회원 이름:을지문덕

번호:1 이름:을지문덕

번호:2 이름:홍길동

번호:3 이름:김구



본문

[디딤돌 C언어] 88. 용자

[디딤돌 C언어] 89. 동적 배열 헤더 작성


반응형