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 | 
										
									
										
									
댓글