관리 메뉴

DREAM IT, WISH IT, DO IT

[C - 동적배열] 동적배열 활용 예제 본문

Programming/C/C++

[C - 동적배열] 동적배열 활용 예제

개발일지 오세빈 2012. 1. 26. 16:53

#include stdio.h
#include string.h
#include stdlib.h

struct tag_NameCard 
{
	char name[10];
	char tel[15];
	char addr[32];
};

#define ELETYPE tag_NameCard
ELETYPE *ar;
unsigned size;
unsigned num;
unsigned growby;

void InitArray(unsigned asize, unsigned agrowby)
{
	size = asize; // 초기 할당량
	growby = agrowby; // 추가 여유분
	num = 0;
	ar = (ELETYPE *)malloc(size * sizeof(ELETYPE));
	// 갯수(size)에 크기(sizeof(ELETYPE))를 곱하여 필요한 양을 계산한다.
}

void Insert(int index, ELETYPE value)
{
	unsigned need;
	
	need = num + 1;
	if (need > size) {			// 초기 할당량보다 필요한 공간이 커지게 되면
		size = need + growby;	// 필요한 공간에 여유분(5)을 더해서 메모리를 재할당 한다.
		ar = (ELETYPE *)realloc(ar, size * sizeof(ELETYPE)); 
		// 이미 할당되어진 ar에 여유분 메모리 재할당.
	}
	memmove(ar + index + 1, ar + index, (num - index) * sizeof(ELETYPE));
		// 해당 인덱스에서 한칸 뒤로 밀어서 복사해버림.(중간에 공간 생김)
	ar[index] = value; // 그 자리에 데이터 삽입
	num++;
}

void Delete(int index)
{
	memmove(ar + index, ar + index + 1, (num - index - 1)*sizeof(ELETYPE));
		// 해당 인덱스에서 한칸 앞으로 밀어서 복사해버림.
	num--;
}

void Append(ELETYPE value)
{
	Insert(num, value);
	// 마지막 자리에 데이터 추가.
}

void UnInitArray()
{
	free(ar); // 할당받은 메모리 해제
}

/*
void DumpArray(char* sMark)
{
	unsigned i;
	printf("%16s => Size = %02d, Count = %02d : ", sMark, size, num);
	for (i = 0; i < num; i++) {
		printf("%2d ",ar[i]);
	}
	printf("\n");
}
*/

int main()
{
	char ch[1];
	unsigned i;
	tag_NameCard Temp;
	
	InitArray(10, 5);
	for(;;){
		puts("명령을 입력하세요 (1.보기, 2.추가, 3.삭제, Q.종료)");
		gets(ch);
		puts("");
		if (*ch == 'Q' || *ch == 'q') {
			break;
		}
		
		switch (*ch) {
			case '1':
				if (num == 0) {
					puts("등록된 내용이 없습니다.");
				} else {
					for(i = 0; i < num; i++) {
						printf("%d, Name : %s, Phone : %s, Address : %s \n",i,ar[i].name, ar[i].tel, ar[i].addr);
					}
				}
				break;
			case '2':
				printf("이름을 입력하세요.(9자)"); 
				gets(Temp.name);
				printf("전화번호를 입력하세요.(14자)"); 
				gets(Temp.tel);
				printf("주소를 입력하세요.(31자)"); 
				gets(Temp.addr);
				Append(Temp);
				break;
			case '3':
				printf("삭제할 번호를 입력하세요 : "); scanf("%d",&i);
				if(i < num) {
					Delete(i);
				}else {
					printf("등록되지 않은 번호입니다.");
				}
				break;
			default:
				break;
		}
	}
	
	UnInitArray();
	return 0;
}
0 Comments
댓글쓰기 폼
Prev 1 2 3 4 5 6 7 Next