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

Chapter 04. 배열(Array)

by GameStudy 2021. 11. 1.

0. 배열의 특징

  - 배열은 사용할 메모리 크기를 고정해서 선언해야 함.

    선언 후에는 절대 변경 불가능함.

    즉, 추가/축소가 불가능함.

 

  - 선언된 메모리는 연속적으로 할당됨.

 

1. 기본 코드

  - 앞으로 연재될 모든 자료구조는 Clang C89 기준의 
    코드들로 이루어짐. 따라서, C가 가능하다면 모든 곳에서 될듯.


  - C 스타일의 배열을 그대로 사용하기엔
    메모리 스탬프가 걱정됨. 

  - 분할 컴파일을 통해서 배열을 아에 다른 파일에다가
    정적으로 선언하고, 메모리 스탬프를 막을 정적 변수를
    하나 더 선언 하고자 했음.

  - 그마저도 한 문제에 여러 개의 배열이 필요할 수 있어서,
    그냥 정적 배열이 아닌 구조체를 사용함.
    뭔가 아주 살짝의 문법 어필도 가능할듯?

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <assert.h>

enum {
    FALSE = 0,
    TRUE = 1,
    INVALID_INDEX = -1,
    MAX_COUNT = 101
};

typedef struct array {
    int     nArray[MAX_COUNT];
    size_t  uCount;
} array_t;

void insert(array_t* _pArray, size_t _uIdx, int _nData);
void orderly_remove(array_t* _pArray, size_t _uIdx);
void unorderly_remove(array_t* _pArray, size_t _uIdx);
size_t search(array_t* _pArray, int _nData);
void print(array_t* _pArray);

int main(void)
{
    size_t i;
    array_t arr = {0,};

    for (i = 0; i < 5; ++i)
    {
        insert(&arr, i, (int)i * 2);
    }
    print(&arr);

    orderly_remove(&arr, 2);
    print(&arr);

    unorderly_remove(&arr, 1);
    print(&arr);

    printf("1 is in %zu", search(&arr, 6));

    return 0;
}

void insert(array_t* _pArray, size_t _uIdx, int _nData)
{
    size_t  i;
    
    assert(_uIdx <= _pArray->uCount);
    assert(_pArray->uCount < MAX_COUNT);

    for (i = _pArray->uCount; i > _uIdx; --i)
    {
        _pArray->nArray[i] = _pArray->nArray[i - 1];
    }
    _pArray->nArray[_uIdx] = _nData;
    ++_pArray->uCount;
}

void orderly_remove(array_t* _pArray, size_t _uIdx)
{
    size_t  i;

    assert(_uIdx <= _pArray->uCount);

    --_pArray->uCount;
    for (i = _uIdx; i < _pArray->uCount; ++i) {
        _pArray->nArray[i] = _pArray->nArray[i + 1];
    }
}

void unorderly_remove(array_t* _pArray, size_t _uIdx)
{
    assert(_uIdx < _pArray->uCount);

    _pArray->nArray[_uIdx] = _pArray->nArray[--_pArray->uCount];
}

size_t search(array_t* _pArray, int _nData)
{
    size_t  i;

    for (i = 0; i < _pArray->uCount; ++i)
    {
        if (_nData == _pArray->nArray[i])
        {
            return i;
        }
    }
    return INVALID_INDEX;
}

void print(array_t* _pArray)
{
    size_t i;

    for (i = 0; i < _pArray->uCount; ++i)
    {
        printf("[%zu]: %d\n", i, _pArray->nArray[i]);
    }
}

'C > 자료구조와 알고리듬' 카테고리의 다른 글

Chapter 06. 스택(Stack)  (2) 2021.11.10
Chapter 05. 가변 길이 배열(Variadic Array)  (0) 2021.11.10
Chapter 03. 정렬  (0) 2021.06.18
Chapter 02. 탐색  (0) 2021.06.17
Chapter 01. 자료구조와 알고리듬  (0) 2021.06.17

댓글