

int main() 과 int moveMaxToFront(ListNode **ptrHead) 를 설명할테니까 제대로 이해했는지 판별해봐.
실행파일을 실행하면, int main() 함수부터 읽기 시작해.
인수를 아무것도 전달하지 않고 함수가 stack 에 쌓여.
main() 프레임에서 지역변수 int c, i, j 가 sizeof(int) 만큼 할당돼. 값은 기존에 메모리에 남아있던 쓰레기 값이 그대로 있어.
단, c의 경우, 값이 1이 저장돼.
그리고 ll 구조체가 선언되니까 16바이트만큼 stack 에 할당돼.
그 16바이트 중에서,
ll 의 head 필드는 8바이트 내부에 NULL 값(0x0)으로,
ll 의 size 필드는 4바이트 내부에 0 값(0x0 과 구분되지 않음. 비트 레벨에서는 동일함.)으로 저장돼.
#define NULL ((void*)0)
매크로 상수 NULL 은 메모리 주소 0을 나타내는 상수다.
**return; 에서 return type 은 void
return NULL; 에서 return type 은 void* (왜냐하면 NULL 은 값이 0x0 이고, 타입이 void*(메모리 주소)이기 때문.)
(구체적으로, NULL은 값이 0x0000000000000000. 여기서 0은 16개. 왜냐하면 64비트 CPU 에서 포인터의 크기는 64비트, 2^64 = 16^16)**
c = 1 이니까 c != 0 이므로, while문의 첫 반복이 시작돼.
사용자가 20, 50, 10, 30 순으로 insert 했다고 가정할게.
그리고 2 을 입력했어. 그러면 case 2 와 매치되므로,
moveMaxToFront(&(ll.head)); 가 실행돼. 그래서 함수로 진입하지.
moveMaxToFront(&(ll.head)) 가 stack 에서 main() 위에 쌓여.
moveMaxToFront(&(ll.head)) 프레임에서 지역변수로 4개의 포인터가 자리를 차지해(아직 값은 없어).
pre 포인터 변수에 &20 가 할당돼.
cur 포인터 변수에 &50 가 할당돼.
pre와 cur가 각각 1칸씩 이동한 셈.
cur 의 값이 &50 이니까 while 문 내부가 실행돼.
50 > 20 이므로, if문 내부가 실행돼.
maxNode 포인터 변수에 &50 가 할당돼.
maxPre 포인터 변수에 &20 가 할당돼.
그리고
pre 포인터 변수에 &50 가 할당돼.
cur 포인터 변수에 &10 가 할당돼.
pre와 cur가 각각 1칸씩 이동한 셈.
cur 의 값은 &10 이니까, NULL 이 아니므로, while 문 내부가 실행돼.
10 > 50 은 False 이므로, if문 내부가 실행 안돼.
그리고
pre 포인터 변수에 &10 가 할당돼.
cur 포인터 변수에 &30 가 할당돼.
pre와 cur가 각각 1칸씩 이동한 셈.
cur 의 값이 &30 이니까 while문 내부가 실행돼.
30 > 50 은 False 이므로, if 문 내부가 실행 안돼.
그리고
pre 포인터 변수에 &30 가 할당돼.
cur 포인터 변수에 NULL 가 할당돼.
cur 의 값은 NULL 이니까, while 문의 조건은 False 이고, while 문 내부가 실행 안돼.
maxPre 값은 NULL 가 아니므로, if문 내부가 실행 안돼.
&20 다음에 &10을 연결해: [20 -> 10 -> 30]
&50 다음에 &20을 연결해: [50 -> 20 -> 10 -> 30]
*ptrHead 변수(ll.head)에 &50 을 할당해.
return 0 이 되면서, moveMaxToFront() 함수를 빠져나가고,
stack 에서 해당 함수의 스택 프레임이 제거되고,
다시 main() 스택 프레임으로 진입해.
printf 함수가 실행되고,
printList(&ll) 가 실행되고,
removeAllItems(&ll) 가 실행되고,
break; 로 switch문을 빠져나가면서,
while문의 조건식인 c != 0 을 판별해.
현재 c = 2 이므로 True 라서 while문 내부로 들어가고,
printf() 가 실행되고, scanf() 가 실행되고,
사용자가 0 을 입력했다고 가정하면, 변수 c 에 0 값이 대입되고,
swich문에서 case 0 에 match 가 되면서, removeAllItems(&ll); 가 실행되고, break 로 switch문을 탈출하고,
while문의 조건식인 c != 0 가 False 가 되면서 while문을 탈출하고,
main() 본문의 다음줄인 return 0; 가 실행되고, main() 함수를 탈출하면서,
스택 프레임에서 main() 함수가 제거되고, 끝나.