본문 바로가기
  • hazard_dev@__
  • hazard_dev@__
C

[C] 단일 연결리스트 누구나 쉽게 이해하기!(LinkedList)

by Hazard3_o00sung 2020. 12. 26.
728x90

강력한 언어 C언어입니다

Powerful Language C

  예전에 C언어를 이용해서 연결 리스트에 대한 포스팅을 한 적이 있습니다. 보다 보니 문제가 너무 많더군요 코드의 가독성도 엉망인데 더불어 설명 또한 너무 중구난방이라 정리해서 다시 올리고자 합니다!! 단일 연결 리스트에 대한 설명은 아래 포스트를 참고해서 개념만 익히고 오시는 것을 추천드립니다. C++로 작성한 연결 리스트이지만, 개념에 대한 설명은 모두 같습니다!

hazarddev.tistory.com/39

 

C++로 구현하는 자료구조!!!연결리스트(LinkedList)@@

Linked List - Singly Linked List 이번 포스팅에서는 링크드 리스트에 대해서 포스팅할 예정입니다. 이전에 큐, 스택을 배웠으니 링크드 리스트의 개념 또한 그렇게 어려운 개념이 아닙니다. 솔직히 말

hazarddev.tistory.com

코드에 대한 설명으로 이번 설명을 대체하도록 하겠습니다!!

 

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <stdlib.h>
 
typedef struct Node{
    int val;
    struct Node *link;
}Node;
 
 
typedef struct LinkedList{
    Node *head;
}LinkedList;
 
cs

 

우선 표준 헤더파일들을 포함해준 다음 연결 리스트의 단일 값이 되어줄 노드의 구조체를 구현합니다. 노드 안에는 정수 값을 담을 변수와 그다음을 가리키는 포인터 변수가 담겨있습니다. 그리고 LinkedList구조체 내부에는 맨 처음 값을 가리키는 변수를 담습니다!! 

 

1
2
3
4
5
6
LinkedList * createHeadNode(void)
{
    LinkedList *ll = malloc(sizeof(LinkedList));
    ll->head = NULL;
    return ll;
}
cs

 

사실 위 함수는 main 함수에서 메모리 할당을 해주어도 좋으나, 함수로 선언해서 main함수의 복잡도를 낮추는 것이 매우 중요합니다. 따라서 위 코드와 같이 메모리 할당을 마친 연결 리스트를 반환하는 함수를 선언합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void push(LinkedList *node, int value){
    if (node->head == NULL){
        Node *newNode = (Node *)malloc(sizeof(Node));
        newNode->val = value;
        newNode->link = NULL;
        node->head = newNode;
    }else{
        Node *tempNode = node->head;
        while (tempNode->link != NULL){
            tempNode = tempNode->link;
        }
        Node *newNode = (Node *)malloc(sizeof(Node));
        newNode->val = value;
        newNode->link = NULL;
        tempNode->link = newNode;
    }
}
cs

 

이전 설명글에서는 사실 코드가 너무 난잡해서 이해하기 힘드셨을거라 생각합니다. 그래서 코드의 이름을 보기 좋게 변경해주었습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void deleteNode(LinkedList *node, int value){
    Node *temp = node->head;
    if (temp->val == value){
        temp = temp->link;
        free(temp);
        return;
    }else{
        while (temp->val != value){
            temp = temp->link;
        }
        if (temp->link == NULL){
            return;
        }else{
            Node *temp2 = node->head;
            while (temp2->link != temp){
                temp2 = temp2->link;
            }
            temp2->link = temp->link;
            free(temp);
            return;
        }
    }
}
 
cs

 

연결 리스트는 선형 자료구조라는 점은 알고 계실거라 생각합니다. 그렇다면 내가 원하는 노드를 삭제하기 위해선 우선 순회를 해주어야 합니다. 순회 도중 찾고자 하는 값이 일치되는 노드의 값을 찾게 되면 순회를 멈추고 찾은 노드의 이전 노드의 link값을 찾는 노드의 link값으로 연결해준 뒤 노드의 메모리를 해제해주고 마무리합니다!

 

1
2
3
4
5
6
7
8
9
void show(const LinkedList *node) {
    Node *temp = node->head;
    while (temp->link != NULL){
        printf("%d ->", temp->val);
        temp = temp->link;
    }
    printf("NULL\n");
    return;
}
cs

 

show함수는 순회하면서 값을 반환하는 함수입니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void AllFree(LinkedList *node){
    Node *temp = malloc(sizeof(Node));
    while (node->head != NULL){
        node->head= temp;
        node->head = node->head->link;
        free(temp);
        temp = NULL;
    }
}
 
int
main()
{
    LinkedList *ll = createHeadNode();
    push(ll,1);
    push(ll,2);
    push(ll,3);
    push(ll,4);
    push(ll,5);
    show(ll);
    deleteNode(ll, 3);
    show(ll);
    return 0
}
cs

 

프로그램이 종료될 때 당연히 LinkedList의 메모리는 해제되어야하기 때문에 AllFree()라는 함수를 통해서 모든 노드들의 메모리를 해제해줍니다. 지금 main함수에서 AllFree가 아래에 선언 안 돼있지만, 종료되기 전에 작성해서 선언을 통해 메모리 해제를 해주시면 됩니다!!

 

이상입니다!!

 

글 잘 읽으셨다면 공감하트 한 번씩 눌러주시면 감사하겠습니다!!

 

댓글로 피드백, 문의, 질문 모두 받으니까요 언제든 주세요!!

 

감사합니다😇😇😇😇😇😇😇😇

728x90

댓글