본문 바로가기
C/자료구조와 알고리듬

Chapter 05. 가변 길이 배열(Variadic Array)

by GameStudy 2021. 11. 10.

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

댓글