Notice
Recent Comments
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
Tags
- 안드로이드
- 스시
- git
- c#
- chart
- 여행지도
- Android
- 갤럭시 노트
- 깃허브
- 서면 맛집
- 깃
- 경성대 맛집
- chrome
- 부경대 맛집
- 타이젠
- 태국지도
- 태국여행준비물
- 태국 여행정보
- github
- 일정관리
- 태국여행
- 자바
- 크롬
- 갤럭시 노트 해외판
- 맛집
- 소프트웨어
- Tizen
- java
- 삼성소프트웨어멤버십
- SDK
- Today
- 0
- Total
- 211,887
DREAM IT, WISH IT, DO IT
[C - 동적배열] 동적배열 활용 예제 본문
#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;
}
'Programming > C/C++' 카테고리의 다른 글
| Editplus, Visual Studio Compiler 연동하기 (1) | 2013.02.18 |
|---|---|
| [Linux Kernel] 리눅스 커널 소스입니다. (0) | 2012.10.20 |
| [C - 동적배열] 동적배열 활용 예제 (0) | 2012.01.26 |
| [C - 동적배열] 메모리 재할당을 통한 동적배열 (0) | 2012.01.26 |
| [C - 메모리 관리 함수] (0) | 2012.01.26 |
| [C - 동적배열] 배열 요소의 삽입과 삭제 (0) | 2012.01.26 |
0 Comments