[C언어 소스] 사용자 정의 동적 배열(인덱스로 보관)
//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언어] 89. 동적 배열 헤더 작성'C언어 > 디딤돌 C언어 예제' 카테고리의 다른 글
[C언어 소스] fprintf 함수로 특정 파일에 출력하기 (0) | 2016.12.04 |
---|---|
[C언어 소스] 사용자 정의 동적 배열(순차 보관) (0) | 2016.12.03 |
[C언어 소스] 학생 구조체 동적 메모리 할당 (0) | 2016.12.02 |
[C언어 소스] 동적 할당한 메모리의 크기를 확장(realloc 함수 사용) (0) | 2016.12.01 |
[C언어 소스] 기본 형식 동적 메모리 할당(calloc 함수 사용 예) (0) | 2016.12.01 |