0. 가변 길이 배열 특징
- 사용할 메모리의 크기를 추가/축소가 가능함.
다만, 데이터를 이동(복붙)해야 하기에 오버헤드 발생.
- 그래서 추가로 필요한 양보다 1.5배 정도 더 많이 할당받음.
그럼 나중에 더 필요하더라도 데이터 이동 횟수가 줄어듦.
- 그래도 배열이기에, 중간 삽입 및 중간 삭제가 비효율적임.
중간에 삽입하면 밀어버리거나, 삭제하면 당겨와야하기 때문에.
1. 기본 코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
enum {
FALSE = 0,
TRUE = 1,
INVALIDE_INDEX = -1,
INITIAL_CAPACITY = 8,
INCREMENT = 2
};
typedef struct variadic_array {
int* nArray;
size_t uSize;
size_t uCapacity;
} variadic_array_t;
void release(variadic_array_t* _pVA);
void initialize(variadic_array_t* _pVA);
void reallocate(variadic_array_t* _pVA);
void insert(variadic_array_t* _pVA, int _nData);
void print(variadic_array_t* _pVA);
int main(void)
{
int answer;
variadic_array_t va;
initialize(&va);
while(TRUE)
{
printf("Data: ");
scanf("%d", &answer);
insert(&va, answer);
print(&va);
}
return 0;
}
void release(variadic_array_t* _pVA)
{
free(_pVA->nArray);
_pVA->nArray = NULL;
}
void initialize(variadic_array_t* _pVA)
{
_pVA->nArray = (int*)malloc(INITIAL_CAPACITY * sizeof(int));
_pVA->uCapacity = INITIAL_CAPACITY;
_pVA->uSize = 0;
}
void reallocate(variadic_array_t* _pVA)
{
int* pTemp = NULL;
size_t i;
pTemp = (int*)malloc(_pVA->uCapacity * INCREMENT * sizeof(int));
for (i = 0; i < (_pVA->uSize); ++i)
{
pTemp[i] = _pVA->nArray[i];
}
release(_pVA);
_pVA->nArray = pTemp;
_pVA->uCapacity *= INCREMENT;
}
void insert(variadic_array_t* _pVA, int _nData)
{
if (_pVA->uCapacity <= _pVA->uSize)
{
reallocate(_pVA);
}
*(_pVA->nArray + _pVA->uSize) = _nData;
++_pVA->uSize;
}
void print(variadic_array_t* _pVA)
{
size_t i;
for (i = 0; i < _pVA->uCapacity; ++i)
{
printf("[%zu]: %d\n", i, *(_pVA->nArray + i));
}
printf("\n");
}
'C > 자료구조와 알고리듬' 카테고리의 다른 글
Chapter 07. 큐(Queue) (0) | 2021.11.10 |
---|---|
Chapter 06. 스택(Stack) (2) | 2021.11.10 |
Chapter 04. 배열(Array) (0) | 2021.11.01 |
Chapter 03. 정렬 (0) | 2021.06.18 |
Chapter 02. 탐색 (0) | 2021.06.17 |
댓글