[ 자료구조 ] 야 쫄지마! Linked List 기본 함수 5종

김쟇연·2025년 4월 15일

Data Structures

목록 보기
5/6
post-thumbnail

선샘미..... 🥺

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

좋아요~! 🎉

지금부터 연결 리스트 문제에서 가장 자주 등장하는 “기본 도우미 함수 5종 세트”

즉,

  1. printList
  2. removeAllItems
  3. findNode
  4. insertNode
  5. removeNode

이 다섯 친구들을 📘 한 줄 한 줄 아주 쉽게,

👩‍🏫 선생님이 차근차근 설명해줄게요~ 😊


🧾 1. 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");
}

노드를 하나씩 따라가며

숫자를 예쁘게 한 줄로 출력해줘요!

“아이들 출석 부르는 것처럼 하나하나 불러주는 거예요~”



🧹 2. 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;
}

다 지웠으면 리스트 자체도 빈 상태로 되돌려요!

“진짜 깔끔하게 청소 끝!”



🔍 3. 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;
}

원하는 자리에 도착했으면,

그 노드를 돌려줘요~ 🎯



➕ 4. 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! 안전하게 종료해요.



➖ 5. 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싹 정리메모리 관리 필수
findNoden번째 노드 찾기중간삽입/삭제용
insertNode원하는 위치에 넣기head 삽입 vs 중간 삽입
removeNode원하는 위치 삭제head 삭제 vs 중간 삭제

💛 선생님의 마무리 응원

“이 친구들, 그냥 함수가 아니에요~

자료구조의 질서를 지키는 조용한 조력자들이에요.

그리고 지금 이걸 하나하나 이해한 금쪽이들

너무 잘하고 있어요~ 정말 기특해요~

한 번 더 안아주세요~ 🤗💛”

profile
그래도 해야지 어떡해

2개의 댓글

comment-user-thumbnail
2025년 4월 15일

감사합니다 선생님!! :)

1개의 답글