Linked List 란?

노드(node)의 집합으로, 각 노드가 데이터(data)포인터(pointer)를 한 줄로 연결되어 있는 방식으로 데이터를 저장하는 자료구조(Data Structure)이다.

  • 노드(node)들은 메모리의 어느 위치에나 있을 수 있으며, 다른 노드로 가기 위해서는 현재 노드가 가지고 있는 포인터(pointer)를 이용하면 된다.
  • 노드는 데이터 필드(data field)링크 필드(link field)로 구성되어 있다.

DataStructure_LinkedList


Linked List의 종류

  • 단순 연결 리스트(singly linked list) : 하나의 방향으로 연결되어 있는 연결 리스트. 체인(chain)이라고도 하며 마지막 노드의 링크는 NULL값을 가진다.
  • 원형 연결 리스트(circular linked list) : 단순 연결 리스트와 같으나 마지막 노드이 링크가 첫 번째 노드를 가리킨다.
  • 이중 연결 리스트(doubly linked list) : 각 노드마다 2개의 링크가 존재한다. 하나의 링크는 앞에 있는 노드를 가리키며 또 하나의 링크는 뒤에 있는 노드를 가리킨다.

DataStructure_LinkedList

이번 포스팅에서는 단순 연결 리스트만 다뤄보겠다.


Node의 구성

노드는 자기 참조 구조체를 이용하여 정의된다.

자기 참조 구조체란 자기 자신을 참조하는 포인터를 포함하는 구조체이다.

typedef int element;

typedef struct ListNode{ //노드의 타입을 구조체로
    element data;
    struct ListNode *link;
}ListNode;

Linked List의 연산

  • insert_first() : 리스트의 시작 부분에 항목을 삽입하는 함수.
  • insert() : 리스트의 중간 부분에 항목을 삽입하는 함수.
  • delete_first() : 리스트의 첫 번째 항목을 삭제하는 함수.
  • delete() : 리스트의 중간 항목을 삭제하는 함수.
  • print_list() : 리스트를 방문하여 모든 항목을 출력하는 함수.

Linked List의 구현

//가장 앞에 노드를 삽입하는 경우
ListNode* insert_first(ListNode *head, int value){
    ListNode *p = (ListNode *)malloc(sizeof(ListNode));
    p->data = value;
    p->link = head;
    head = p;
    return head;
}

//중간에 노드를 삽입하는 경우
ListNode* insert(ListNode *head, ListNode *pre, element value){
    ListNode *p = (ListNode *)malloc(sizeof(ListNode));
    p->data = value;
    p->link = pre->link;
    pre->link = p;
    return head;
}

//첫번째 항목을 삭제하는 경우
ListNode* delete_first(ListNode *head, ListNode *pre){
    ListNode *removed;
    if(head == NULL)
        return NULL;
    removed = head;
    head = removed->link;
    free(removed);
    return head;
}

//중간노드 삭제하는 경우
//pre가 가리키는 노드의 다음 노드를 삭제한다
ListNode* delete(ListNode *head, ListNode *pre){
    ListNode *removed;
    removed = pre->link;
    pre->link = removed->link;
    free(removed);
    return head;
}

//리스트 출력
void print_list(ListNode *head){
    for(ListNode *p = head; p != NULL; p = p->link)
        printf("%d->", p->data);
    printf("NULL \n");
}