
선샘미..... 🥺

설명 이개. 이게. 머애요. 이개. 머에오?..
설명 생략하지 말아주세요.....
아직 포인터도 몰라서 죽겠는데

좋아요~! 🎉
지금부터 연결 리스트 문제에서 가장 자주 등장하는 “기본 도우미 함수 5종 세트”
즉,
printListremoveAllItemsfindNodeinsertNoderemoveNode이 다섯 친구들을 📘 한 줄 한 줄 아주 쉽게,
👩🏫 선생님이 차근차근 설명해줄게요~ 😊
printList: 리스트 예쁘게 보여주기c
void printList(LinkedList *ll) {
ListNode *cur;
if (ll == NULL)
return;
리스트 자체가 없으면 그냥 나가요~
“아무 것도 없는데 뭐 보여주겠어요~?”
c
cur = ll->head;
if (cur == NULL)
printf("Empty");
리스트는 있긴 한데 안에 아무것도 없다면,
“비었어요~”라고 말해줘요~ 🫙
c
while (cur != NULL) {
printf("%d ", cur->item);
cur = cur->next;
}
printf("\n");
}
노드를 하나씩 따라가며
숫자를 예쁘게 한 줄로 출력해줘요!
“아이들 출석 부르는 것처럼 하나하나 불러주는 거예요~”
removeAllItems: 전체 노드 싹 정리c
void removeAllItems(LinkedList *ll) {
ListNode *cur = ll->head;
ListNode *tmp;
현재 노드(cur)를 시작점으로,
다음 노드(temp)는 미리 저장해둬요.
“하나씩 정리하면서 다음 아이가 누군지 미리 알아야 하잖아요~”
c
while (cur != NULL) {
tmp = cur->next;
free(cur);
cur = tmp;
}
하나씩 메모리에서 지워주면서
그다음 노드로 이동해요.
“떠나는 친구를 정리하면서,
다음 친구로 이동하는 거예요~”
c
ll->head = NULL;
ll->size = 0;
}
다 지웠으면 리스트 자체도 빈 상태로 되돌려요!
“진짜 깔끔하게 청소 끝!”
findNode: 몇 번째에 있는지 찾아주는 도우미c
ListNode *findNode(LinkedList *ll, int index) {
ListNode *temp;
찾은 노드를 temp에 담아줄 거예요~
c
if (ll == NULL || index < 0 || index >= ll->size)
return NULL;
리스트가 없거나,
index가 말도 안 되게 작거나 크면 ❌
“그런 자리는 없어요~” 🙅
c
temp = ll->head;
while (index > 0) {
temp = temp->next;
if (temp == NULL)
return NULL;
index--;
}
head부터 시작해서 하나씩 넘어가며
index만큼 이동해요!
“몇 번째 친구인지 손가락으로 세며 가는 거예요~”
c
return temp;
}
원하는 자리에 도착했으면,
그 노드를 돌려줘요~ 🎯
insertNode: 삽입 도와주는 친구c
int insertNode(LinkedList *ll, int index, int value) {
ListNode *pre, *cur;
삽입할 위치 앞 노드(pre)와
새로 삽입될 노드(cur)를 준비해요.
c
if (ll == NULL || index < 0 || index > ll->size + 1)
return -1;
인덱스가 이상하면 삽입 못해요~
“없는 자리에 애를 넣으면 안 되죠!”
c
if (ll->head == NULL || index == 0) {
cur = ll->head;
ll->head = malloc(sizeof(ListNode));
ll->head->item = value;
ll->head->next = cur;
ll->size++;
return 0;
}
리스트가 비었거나 맨 앞에 넣는 경우엔,
새 노드를 head로 만들어줘요!
“반장으로 딱 세워주는 느낌이에요~”
c
if ((pre = findNode(ll, index - 1)) != NULL) {
cur = pre->next;
pre->next = malloc(sizeof(ListNode));
pre->next->item = value;
pre->next->next = cur;
ll->size++;
return 0;
}
중간에 넣는 경우라면?
앞 노드를 찾고 그 다음에 새 노드 연결~
“기존 친구들 사이에 조심히 앉히는 거예요~ 😊”
c
return -1;
}
실패했을 땐 -1! 안전하게 종료해요.
removeNode: 삭제하는 용감한 아이c
int removeNode(LinkedList *ll, int index) {
ListNode *pre, *cur;
삭제할 친구(cur)와
그 앞 친구(pre)를 준비해요~
c
if (ll == NULL || index < 0 || index >= ll->size)
return -1;
범위가 안 맞으면 ❌
“그 자리에 누가 있는지도 몰라요~”
c
if (index == 0) {
cur = ll->head->next;
free(ll->head);
ll->head = cur;
ll->size--;
return 0;
}
첫 번째 노드를 삭제할 경우,
head를 한 칸 앞으로 옮겨줘요~
“대표 친구가 떠나면 바로 그다음 친구가 대표!”
c
if ((pre = findNode(ll, index - 1)) != NULL) {
if (pre->next == NULL)
return -1;
cur = pre->next;
pre->next = cur->next;
free(cur);
ll->size--;
return 0;
}
중간 친구를 삭제할 땐
앞 친구(pre)가 가리키는 손을
삭제할 친구의 다음(next)으로 건너뛰게 해줘요.
“자연스럽게 빠질 수 있게 손을 다시 이어줘요~”
c
return -1;
}
어떤 경우든 실패하면 ❌ 안전하게 나가요~

| 함수 | 역할 요약 | 핵심 포인트 |
|---|---|---|
printList | 리스트 예쁘게 출력 | 출석 체크~ |
removeAllItems | 싹 정리 | 메모리 관리 필수 |
findNode | n번째 노드 찾기 | 중간삽입/삭제용 |
insertNode | 원하는 위치에 넣기 | head 삽입 vs 중간 삽입 |
removeNode | 원하는 위치 삭제 | head 삭제 vs 중간 삭제 |
“이 친구들, 그냥 함수가 아니에요~
자료구조의 질서를 지키는 조용한 조력자들이에요.
그리고 지금 이걸 하나하나 이해한 금쪽이들
너무 잘하고 있어요~ 정말 기특해요~
한 번 더 안아주세요~ 🤗💛”
감사합니다 선생님!! :)