0Pricing
C Academy · 강의

단일 연결 리스트

노드와 포인터를 알아봅니다

단일 연결 리스트은(는) CoddyKit의 무료 C Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

연결 리스트란 무엇인가요?

연결 리스트는 노드라는 작은 구조체가 이어진 사슬입니다. 각 노드는 값과 다음 노드를 가리키는 포인터를 저장합니다.

배열과 달리 요소가 메모리에 연속적으로 배치될 필요가 없으며, 리스트를 쉽게 늘리거나 줄일 수 있습니다.

#include <stdio.h>

struct Node {
    int value;
    struct Node *next;
};

int main(void) {
    printf("A node holds a value and a next pointer\n");
    return 0;
}

노드 정의하기

노드 구조체에는 데이터와 다음 노드를 가리키는 struct Node *next가 들어 있습니다.

포인터 형식이 같은 구조체를 가리키므로 노드들이 사슬처럼 연결됩니다.

#include <stdio.h>

struct Node {
    int value;
    struct Node *next;
};

int main(void) {
    struct Node n;
    n.value = 42;
    n.next = NULL;
    printf("value=%d, next is NULL: %d\n", n.value, n.next == NULL);
    return 0;
}

헤드 포인터

리스트는 첫 번째 노드를 가리키는 단일 포인터로 식별하며, 이를 헤드라고 합니다.

빈 리스트는 헤드가 NULL인 경우입니다.

#include <stdio.h>

struct Node { int value; struct Node *next; };

int main(void) {
    struct Node *head = NULL;
    printf("List is empty: %d\n", head == NULL);
    return 0;
}

노드 할당하기

노드는 보통 malloc으로 힙에 생성하여 노드를 만든 함수가 끝난 뒤에도 유지되도록 합니다.

항상 반환 값을 확인하고, 나중에 노드를 해제해야 한다는 점을 기억하세요.

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

struct Node { int value; struct Node *next; };

int main(void) {
    struct Node *n = malloc(sizeof(struct Node));
    n->value = 7;
    n->next = NULL;
    printf("%d\n", n->value);
    free(n);
    return 0;
}

화살표 연산자

구조체를 가리키는 포인터가 있으면 ->를 사용해 멤버에 접근합니다. n->value는 (*n).value와 같은 의미입니다.

연결 리스트에서는 화살표 연산자를 계속 사용하게 됩니다.

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

struct Node { int value; struct Node *next; };

int main(void) {
    struct Node *n = malloc(sizeof(struct Node));
    n->value = 99;
    printf("%d\n", n->value);
    free(n);
    return 0;
}

두 노드 연결하기

노드를 연결하려면 첫 번째 노드의 next가 두 번째 노드를 가리키도록 설정합니다. 마지막 노드의 next는 끝을 표시하기 위해 NULL로 유지합니다.

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

struct Node { int value; struct Node *next; };

int main(void) {
    struct Node *a = malloc(sizeof(struct Node));
    struct Node *b = malloc(sizeof(struct Node));
    a->value = 1; a->next = b;
    b->value = 2; b->next = NULL;
    printf("%d -> %d\n", a->value, a->next->value);
    free(a); free(b);
    return 0;
}

노드 생성 도우미

할당을 반복하는 일은 번거로우므로, 할당하고 초기화한 뒤 새 노드를 반환하는 도우미 함수로 감싸세요.

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

struct Node { int value; struct Node *next; };

struct Node *make(int v) {
    struct Node *n = malloc(sizeof(struct Node));
    n->value = v;
    n->next = NULL;
    return n;
}

int main(void) {
    struct Node *n = make(5);
    printf("%d\n", n->value);
    free(n);
    return 0;
}

작은 리스트 만들기

도우미를 사용해 next 포인터를 연결하여 1 -> 2 -> 3으로 이루어진 세 노드 리스트를 만듭니다.

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

struct Node { int value; struct Node *next; };
struct Node *make(int v){struct Node*n=malloc(sizeof*n);n->value=v;n->next=NULL;return n;}

int main(void) {
    struct Node *head = make(1);
    head->next = make(2);
    head->next->next = make(3);
    printf("%d %d %d\n", head->value, head->next->value, head->next->next->value);
    return 0;
}

리스트 출력하기

모든 값을 출력하려면 헤드에서 시작해 NULL에 도달할 때까지 next 포인터를 따라갑니다.

이 순회 패턴은 거의 모든 리스트 연산의 기초입니다.

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

struct Node { int value; struct Node *next; };
struct Node *make(int v){struct Node*n=malloc(sizeof*n);n->value=v;n->next=NULL;return n;}

int main(void) {
    struct Node *head = make(1);
    head->next = make(2);
    for (struct Node *p = head; p; p = p->next)
        printf("%d ", p->value);
    printf("\n");
    return 0;
}

배열과 연결 리스트 비교

배열은 인덱스로 빠르게 접근할 수 있지만 크기가 고정됩니다. 연결 리스트는 삽입과 삭제가 쉽지만 접근이 느립니다. 요소에 도달하려면 리스트를 순회해야 하기 때문입니다.

프로그램에서 어떤 연산이 주로 수행되는지에 따라 선택하세요.

#include <stdio.h>

int main(void) {
    printf("Array: O(1) index, costly resize\n");
    printf("List:  O(n) index, cheap insert/delete\n");
    return 0;
}

전체 목록 해제하기

malloc으로 할당한 모든 노드는 해제해야 합니다. 목록을 순회하되, 각 노드를 해제하기 전에 다음 포인터를 저장해야 합니다. 그렇지 않으면 체인의 나머지 부분을 잃게 됩니다.

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

struct Node { int value; struct Node *next; };
struct Node *make(int v){struct Node*n=malloc(sizeof*n);n->value=v;n->next=NULL;return n;}

int main(void) {
    struct Node *head = make(1);
    head->next = make(2);
    struct Node *p = head;
    while (p) {
        struct Node *nxt = p->next;
        free(p);
        p = nxt;
    }
    printf("freed all nodes\n");
    return 0;
}

빠른 확인

연결 목록 구조에 대한 이해도를 확인해 보세요.

복습

단일 연결 목록의 기초를 배웠습니다.

  • 노드는 값과 next 포인터를 보유하고, 헤드는 첫 번째 노드를 가리킵니다.
  • malloc으로 노드를 할당하고 ->로 멤버에 접근합니다.
  • 마지막 노드의 next는 NULL이며, 포인터를 따라가며 순회합니다.
  • 항상 모든 노드를 해제하고, 해제하기 전에 next를 저장합니다.

자주 묻는 질문

“단일 연결 리스트” 강의는 무료인가요?

네 — “단일 연결 리스트” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C Academy 강의 전체를 잠금 해제할 수 있습니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“단일 연결 리스트”에서 뭘 배우나요?

노드와 포인터를 알아봅니다 브라우저에서 직접 실행하는 실습 코드로 C Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“단일 연결 리스트” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 단일 연결 리스트
  2. 삽입과 삭제
  3. 순회와 검색
  4. 이중 연결 리스트
← C Academy(으)로 돌아가기