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}