C로 코딩을 하다가, 문득 문제를 만났다!!
짜고자 하는 함수는, tree의 중위순회한 결과 (작은 값부터 오름차순으로)를
arr에 담아주는 함수이다.
함수는 짧으니 아래를 보며 이해하자!
int i = 0;
int inorder_array(node_t *n, key_t *arr) {
if (n) {
inorder_array(n -> left, arr);
// printf("%d \n %d \n", n -> key, i);
arr[i++] = n -> key;
inorder_array(n -> right, arr);
}
return 0;
}
이렇게 짤 경우, int i = 0 이라고 i라는 global 변수를 선언했다.
그래서 함수 내부에서 i 값을 증가시키고, arr[i]에 중위순회의 값을 넣어주는 방식이다 (즉, i는 index이다)
재귀적으로 함수를 짜기 위해서, global 변수를 선언하여 index역할을 하게 했는데
이런 경우 global 변수 없이는 재귀를 사용할 수 없는건지 궁금해졌다!
해서 코치님에게 여쭤봤고, 다음과 같은 코드를 알려주셨다.
int inorder_array(node_t *n, key_t *arr, size_t *c_ptr) {
if (n) {
inorder_array(n -> left, arr, c_ptr);
// printf("%d \n %d \n", n -> key, i);
arr[*c_ptr] = n -> key;
(*c_ptr)++;
inorder_array(n -> right, arr, c_ptr);
}
return 0;
}
이렇게 사용할 경우, c_ptr 변수의 주소값을 함수의 인자로 받아서 그 주소값에 해당하는 값을 변경해줄 수 있다.
이러면 global 변수를 사용하지 않고 함수의 argument를 이용해서 재귀적으로 코드를 짤 수 있다!
C언어에서 포인터와 함수 개념을 배우면서 가장 중요하고 기초적인 개념인데 이걸 까먹다니 ㅠㅠ
포인터를 잘 사용하면 global처럼 사용할 수 있다는 사실!!!!
오늘의 큰 배움
'프로그래밍 > JUNGLE' 카테고리의 다른 글
PintOS project2. User Program (0) | 2021.10.14 |
---|---|
PintOS project1. Threads (0) | 2021.10.04 |
RB Tree 삽입 (0) | 2021.09.08 |
이진 탐색 트리(Binary Search Tree) C로 구현하기 (0) | 2021.09.06 |
RB Tree [레드 블랙 트리] (2) | 2021.09.03 |