malloc() 매크로
#define MALLOC(ptr, type, size) \
do { \
ptr = (type*)malloc((size) * (type)); \
if (ptr == NULL) { \
fprintf(stderr, "Insufficient memory"); \
exit(EXIT_FAILURE); \
} \
} while(0)
MALLOC(ptr, sizeof(int), 10); 과 같이 사용
-------
SWAP(x, y, t) 매크로
#define SWAP(x, y, t) ((t) = (x), (x) = (y), (y) = (t))
사용 예시
void sort(int list[], int n) { // 선택 정렬 알고리즘
int i, j, min, temp;
for(i = 0; i < n - 1; i++) {
min = i; // 현재 최소값의 인덱스를 i로 초기화
// i 이후의 값들 중 최소값을 찾음
for(j = i + 1; j < n; j++) {
if(list[j] < list[min])
min = j; // 더 작은 값이 있다면 그 인덱스를 min으로 변경
}
SWAP(list[i], list[min], temp); // 최소값을 현재 i 위치에 있는 값과 교환
}
-------
COMPARE(x, y) 매크로
#define COMPARE(x, y) (((x) < (y)) ? -1 : ((x) == (y) ? 0 : 1))
사용 예시
int binsearch(int list[], int searchnum, int left, int right) { // 이진 탐색 알고리즘
int middle;
// 이진 탐색이 끝날 때까지(left가 right보다 작거나 같을 동안)
while (left <= right) {
// 중간 인덱스 계산(left와 right의 중간 값)
middle = (left + right) / 2;
// list[middle]과 searchnum을 비교
switch (COMPARE(list[middle], searchnum)) {
// list[middle]이 searchnum보다 작은 경우,
// 찾고자 하는 값이 오른쪽에 있으므로 탐색 범위를 오른쪽으로 좁힘
case -1:
left = middle + 1;
break;
// list[middle]이 searchnum과 같은 경우, 값을 찾았으므로 인덱스를 반환
case 0:
return middle;
// list[middle]이 searchnum보다 큰 경우,
// 찾고자 하는 값이 왼쪽에 있으므로 탐색 범위를 왼쪽으로 좁힘
case 1:
right = middle - 1;
break;
}
}
// 값이 배열 내에 없는 경우, -1을 반환
return -1;
}
-------
🤔: 저 근데 궁금한 게 있는데 매크로는 왜 사용하나요?
🐢: 매크로를 사용하면 먼저 코드 재사용성이 높아집니다. 반복되는 코드를 하나의 이름으로 정의해 재사용할 수 있고, 이에 따라 코드 가독성이 향상돼요! 또 특정 값이나 코드를 변경할 필요가 있다면 매크로 정의 부분만 수정하면 돼서 유지보수가 용이해집니다!
'자료구조' 카테고리의 다른 글
큐(Queue) (0) | 2025.01.16 |
---|---|
스택(Stack) (0) | 2025.01.15 |
Stack 알아보기 (1) | 2024.10.06 |
연결리스트(Linked List) 알아보기 (0) | 2024.09.30 |
기본 정렬 알고리즘 알아보기 (0) | 2024.09.27 |