74.5 연습문제: 특정 노드 검색하기

다음 소스 코드에서 findNode 함수를 완성하세요. 이 함수는 연결 리스트를 순회하면서 지정된 값이 들어있는 노드를 찾아야 합니다.

practice_linked_list_find_node.c

#include <stdio.h>
#include <stdlib.h>

struct NODE {
    struct NODE *next;
    int data;
};

void addFirst(struct NODE *target, int data)
{
    struct NODE *newNode = malloc(sizeof(struct NODE));
    newNode->next = target->next;
    newNode->data = data;

    target->next = newNode;
}

struct NODE *findNode(struct NODE *node, int data)
{
    _________________________________
    ...
    _________________________________
}

int main()
{
    struct NODE *head = malloc(sizeof(struct NODE));
    head->next = NULL;

    addFirst(head, 10);
    addFirst(head, 20);
    addFirst(head, 30);

    struct NODE *found = findNode(head, 20);
    printf("%d\n", found->data);

    struct NODE *curr = head->next;
    while (curr != NULL)
    {
        struct NODE *next = curr->next;
        free(curr);
        curr = next;
    }

    free(head);

    return 0;
}

실행 결과

20

정답

if (node == NULL)
    return NULL;

struct NODE *curr = node->next;
while (curr != NULL)
{
    if (curr->data == data)
        return curr;

    curr = curr->next;
}

return NULL;

해설

단일 연결 리스트는 특정 노드를 찾으려면 첫 번째 노드부터 마지막 노드까지 차례대로 검색해야 합니다. 따라서 while (curr != NULL)과 같이 NULL이 아닐 때 계속 반복합니다. 여기서 if (curr->data == data)와 같이 현재 노드의 데이터와 매개변수로 받은 데이터를 비교하여 같으면 현재 노드를 반환하고, 다르면 다음 노드로 넘어가면 됩니다.

만약 값을 찾지 못했거나 처음부터 nodeNULL이라면 NULL을 반환합니다