dynamic_array.c

Download
c 132 lines 2.8 KB
  1// dynamic_array.c
  2// 동적 배열 구현
  3
  4#include <stdio.h>
  5#include <stdlib.h>
  6#include <string.h>
  7
  8typedef struct {
  9    int* data;
 10    size_t size;
 11    size_t capacity;
 12} DynamicArray;
 13
 14// 동적 배열 생성
 15DynamicArray* array_create(size_t initial_capacity) {
 16    DynamicArray* arr = malloc(sizeof(DynamicArray));
 17    if (!arr) return NULL;
 18
 19    arr->data = malloc(initial_capacity * sizeof(int));
 20    if (!arr->data) {
 21        free(arr);
 22        return NULL;
 23    }
 24
 25    arr->size = 0;
 26    arr->capacity = initial_capacity;
 27    return arr;
 28}
 29
 30// 요소 추가
 31int array_push(DynamicArray* arr, int value) {
 32    if (arr->size >= arr->capacity) {
 33        // 용량 2배로 확장
 34        size_t new_capacity = arr->capacity * 2;
 35        int* new_data = realloc(arr->data, new_capacity * sizeof(int));
 36
 37        if (!new_data) return 0;  // 실패
 38
 39        arr->data = new_data;
 40        arr->capacity = new_capacity;
 41
 42        printf("용량 확장: %zu -> %zu\n", arr->capacity / 2, arr->capacity);
 43    }
 44
 45    arr->data[arr->size++] = value;
 46    return 1;  // 성공
 47}
 48
 49// 요소 제거
 50int array_pop(DynamicArray* arr, int* value) {
 51    if (arr->size == 0) return 0;  // 빈 배열
 52
 53    *value = arr->data[--arr->size];
 54    return 1;
 55}
 56
 57// 특정 인덱스 값 가져오기
 58int array_get(DynamicArray* arr, size_t index, int* value) {
 59    if (index >= arr->size) return 0;
 60
 61    *value = arr->data[index];
 62    return 1;
 63}
 64
 65// 특정 인덱스 값 설정
 66int array_set(DynamicArray* arr, size_t index, int value) {
 67    if (index >= arr->size) return 0;
 68
 69    arr->data[index] = value;
 70    return 1;
 71}
 72
 73// 배열 출력
 74void array_print(DynamicArray* arr) {
 75    printf("[");
 76    for (size_t i = 0; i < arr->size; i++) {
 77        printf("%d", arr->data[i]);
 78        if (i < arr->size - 1) printf(", ");
 79    }
 80    printf("]\n");
 81}
 82
 83// 메모리 해제
 84void array_destroy(DynamicArray* arr) {
 85    if (arr) {
 86        free(arr->data);
 87        free(arr);
 88    }
 89}
 90
 91int main(void) {
 92    DynamicArray* arr = array_create(2);
 93
 94    printf("=== 동적 배열 테스트 ===\n\n");
 95
 96    // 요소 추가
 97    printf("요소 추가: 10, 20, 30, 40, 50\n");
 98    array_push(arr, 10);
 99    array_push(arr, 20);
100    array_push(arr, 30);
101    array_push(arr, 40);
102    array_push(arr, 50);
103
104    printf("배열: ");
105    array_print(arr);
106    printf("크기: %zu, 용량: %zu\n\n", arr->size, arr->capacity);
107
108    // 요소 제거
109    int value;
110    array_pop(arr, &value);
111    printf("제거된 값: %d\n", value);
112    printf("배열: ");
113    array_print(arr);
114    printf("\n");
115
116    // 특정 인덱스 값 변경
117    array_set(arr, 1, 999);
118    printf("인덱스 1을 999로 변경\n");
119    printf("배열: ");
120    array_print(arr);
121    printf("\n");
122
123    // 값 가져오기
124    array_get(arr, 2, &value);
125    printf("인덱스 2의 값: %d\n", value);
126
127    // 메모리 해제
128    array_destroy(arr);
129
130    return 0;
131}