์ž๋ฃŒ๊ตฌ์กฐ 5๊ฐ• ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์‹ค์Šต

์˜ฌํ•ด ์ดˆ ๋ถ€ํ„ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ณต๋ถ€ ์ค‘์ด๋‹ค. ์ƒ๋ฐ˜๊ธฐ์—๋Š” ์—ด์‹ฌํžˆ ๊ณต๋ถ€ํ•˜๋‹ค๊ฐ€, ์ง€๊ธˆ์€ ์ง„๋„๊ฐ€ ๋งค์šฐ ๋”๋””์ง€๋งŒ..
๊ทธ ์ค‘์— ์žฌ๋ฐŒ๊ฒŒ ๊ณต๋ถ€ํ•˜๊ณ  ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์—์„œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๋ฐฐ์šด ๊ฑธ ์‘์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์„ ์งœ ๋ดค๋‹ค.

์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋Š” ์ตœ๋Œ€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋ฏธ๋ฆฌ ์ •ํ•˜์ง€ ์•Š๊ณ , ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋™์ ํ• ๋‹นํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘์— ๋…ธ๋“œ(Node)๊ฐ€ ์ถ”๊ฐ€๋  ๋•Œ ๋งˆ๋‹ค ๊ณต๊ฐ„์„ ํ™•๋ณดํ•œ๋‹ค. ๋…ธ๋“œ(Node)๋Š” ๋ฐ์ดํ„ฐ์™€ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋ฅดํ‚ค๋Š” ๋งํฌ์˜ ํ•œ ๋ฉ์–ด๋ฆฌ๋กœ, ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์—์„œ์˜ ๋ฌผ๋ฆฌ์ ์ธ ์ˆœ์„œ์™€ ์ƒ๊ด€์—†์ด ๋ฐ์ดํ„ฐ ๊ฐ„์˜ ๋…ผ๋ฆฌ์ ์ธ ์ˆœ์„œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

data structures 05 linkedlist 1
head가 가르키는 노드에서 시작, 링크를 통해 데이터가 논리적인 순서로 연결된다.
data structures 05 linkedlist 2
메모리 공간에서의 모습 예시
삽화 참고: 자료구조, 정광식 저

์„ค๋ช…์€ ์ด์ฏคํ•˜๊ณ , ๊ทธ๋ž˜์„œ ํ”„๋กœ๊ทธ๋žจ์€ ์ด๋ ‡๋‹ค.
๊ฐ•์˜ ๋‚ด์šฉ์„ ์‘์šฉํ•˜์—ฌ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰์— ๋ฐ์ดํ„ฐ ์‚ฝ์ž…/์‚ญ์ œ, ํŠน์ • ์œ„์น˜์— ์‚ฝ์ž…/์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

data structures 05 linkedlist 3 이해하기 쉬운 배열/스택/큐에서 갑자기 내용이 복잡해졌지만, 이거 만들면서 차차 이해해 나갔다. 어려웠지만 은근히 재밌었다. ^^ 아래는 소스코드이다. [Mac OS, Xcode에서 C로 개발]
//
//  main.c
//  DataStructures_05_02
//
//  Created by Jinjoo on 2018. 10. 27..
//  Copyright ยฉ 2018๋…„ Jinjoo. All rights reserved.
//

#include <stdio.h>
#include <stdlib.h> //๋™์ ํ• ๋‹น์„ ์œ„ํ•ด ํ•„์š”

/* ๋‹จ์ˆœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋…ธ๋“œ ๊ตฌ์กฐ ์ •์˜ */
typedef struct ListNode {
    int data;
    struct ListNode* link;
}listNode;

/* ๋ฆฌ์ŠคํŠธ์˜ ํ—ค๋“œ(first) ๋…ธ๋“œ ๊ตฌ์กฐ ์ •์˜ */ 
typedef struct {
    listNode* head;
}headNode;

headNode* createLinkedList_h(void){ //ํ—ค๋“œ ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜
    headNode* H; //ํ—ค๋“œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฅดํ‚ค๋Š” ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ H ์ƒ์„ฑ
    H = (headNode*)malloc(sizeof(headNode)); //ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ์‚ฌ์ด์ฆˆ ํฌ๊ธฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ํ• ๋‹น๋ฐ›๊ณ , ๊ทธ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์˜ ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜
    H->head = NULL; //๊ฐ€๋ฅดํ‚ฌ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋‹ˆ NULL๊ฐ’ ์ €์žฅ
    return H;
}


/* ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋…ธ๋“œ ์‚ฝ์ž… */
void addNode(headNode* H, int x){
    listNode* newNode;
    listNode* lastNode;
    
    newNode = (listNode*)malloc(sizeof(listNode));
    newNode->data = x; //๋ฐ์ดํ„ฐ๋กœ x์ž…๋ ฅ๋ฐ›์Œ
    newNode->link = NULL; //์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๋งˆ์ง€๋ง‰์— ์ถ”๊ฐ€๋˜๋Š” ๋…ธ๋“œ์ด๋ฏ€๋กœ link๋Š” NULL์„ ๊ฐ€๋ฅดํ‚ด
    if(H->head==NULL){ //ํ—ค๋“œ ๋…ธ๋“œ๊ฐ€ NULL์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์œผ๋ฉด
        H->head = newNode; //ํ—ค๋“œ ๋…ธ๋“œ์— ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•จ
        return;
    }//ํ—ค๋“œ ๋…ธ๋“œ๊ฐ€ NULL์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ฉด,
    lastNode = H->head;
    while(lastNode->link != NULL)lastNode = lastNode->link; //NULL์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„
    lastNode->link = newNode; //์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค
}

/* ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋…ธ๋“œ ์‚ญ์ œ */
void deleteNode(headNode* H){
    listNode* prevNode;
    listNode* delNode;
    if(H->head->link == NULL){
        free(H->head);
        H->head = NULL;
        return;
    }else{
        prevNode = H->head;
        delNode = H->head->link;
        while(delNode->link != NULL){ //link๊ฐ€ NULL๊ฐ’์„ ๊ฐ€์ง„, ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„
            prevNode = delNode;
            delNode = delNode->link;
        }
        free(delNode); //ํ•ด์ œ ํ•œ๋‹ค
        prevNode->link = NULL; //๊ทธ๋ฆฌ๊ณ  ๊ทธ ์•ž์— ์žˆ๋˜ ๋…ธ๋“œ์˜ link๋ฅผ NULL๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.
    }
}

/* ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ํŠน์ • ๋…ธ๋“œ ๋‹ค์Œ์— ์‚ฝ์ž… */
void additNode(headNode* H, int itdata, int *x){
    listNode* prevNode;
    prevNode = H->head;
    while(prevNode->data != itdata)
    {
        if(prevNode->link == NULL){
            printf("[์„ ํƒํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์–ด, ์ถ”๊ฐ€ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.]\n\n");
            return;
        }
        else{
            prevNode = prevNode->link;
        }
    }
    printf("[์„ ํƒํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค! ์ด ๋’ค์— ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.]\n\n");
    *x+=100;
    listNode* newNode;
    newNode = (listNode*)malloc(sizeof(listNode));
    newNode->data = *x;
    newNode->link = NULL;
    
    newNode->link = prevNode->link;
    prevNode->link = newNode;
    return;
}

/* ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ํŠน์ • ๋…ธ๋“œ ์‚ญ์ œ */
void deleteitNode(headNode* H, int itdata){
    listNode* delNode;
    listNode* prevNode;
    
    if(H->head->link == NULL && H->head->data == itdata){
        free(H->head);
        H->head = NULL;
        return;
    }else if(H->head->link != NULL && H->head->data == itdata){
        delNode = H->head;
        H->head = H->head->link;
        free(delNode);
        return;
    }else{
        delNode = H->head;
        prevNode = delNode;
        while(delNode->data != itdata)
        {
            if(delNode->link == NULL && delNode->data != itdata){
                printf("[์„ ํƒํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์–ด, ์‚ญ์ œํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.]\n\n");
                return;
            }
            else{
                prevNode = delNode;
                delNode = delNode->link;
            }
        }
        printf("[์„ ํƒํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค! ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.]\n\n");
        prevNode->link = delNode->link;
        free(delNode);
        return;
    }
}

/* ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์ถœ๋ ฅ */
void printList(headNode* H){
    listNode* p;
    if(H->head == NULL){
        printf("== ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ: ๋ฐ์ดํ„ฐ ์—†์Œ ==\n\n");
    }else{
        printf("== ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ: ");
        p = H->head;
        while(p != NULL){
            printf("%d", p->data);
            p = p->link;
            if(p != NULL){
                printf("->");
            }
        }
        printf(" ==\n\n");
    }
}
int main() {
    headNode* L;
    L = createLinkedList_h();
    int select_function=0, nodeData=0, selectNodeData;
    
    printf("์ž๋ฃŒ๊ตฌ์กฐ 5์žฅ ์‹ค์Šต : ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ        developed by Perlpark\n");
    printf("============================================================\n");
    printf("์ˆ˜ํ–‰ํ•  ๋™์ž‘์„ ์„ ํƒํ•ด ์ฃผ์„ธ์š”.\nโ€ป์ˆซ์ž ์™ธ ๋ฌธ์ž๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋ฉฐ, ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.\n");
    printf("============================================================\n");
    printf("0:๋ฐ์ดํ„ฐ ์‚ฝ์ž…  |  1:๋ฐ์ดํ„ฐ ์‚ญ์ œ  |  2:ํŠน์ • ์œ„์น˜์— ๋ฐ์ดํ„ฐ ์‚ฝ์ž…  |  3:ํŠน์ • ๋ฐ์ดํ„ฐ ์‚ญ์ œ  |  9:์ข…๋ฃŒ\n\n");
    
    while(select_function != 9){
        printf("๋™์ž‘ ์„ ํƒ: ");
        scanf("%d", &select_function);
        switch (select_function) {
            case 0:
                nodeData+=100;
                addNode(L, nodeData);
                printf("\n[์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.]\n\n");
                printList(L);
                break;
            case 1:
                if(L->head == NULL){
                    printf("\n[๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์‚ฝ์ž…๋ถ€ํ„ฐ ํ•ด์ฃผ์„ธ์š”.]\n\n");
                }else{
                    deleteNode(L);
                    printf("\n[์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ–ˆ์Šต๋‹ˆ๋‹ค.]\n\n");
                    printList(L);
                }
                break;
            case 2:
                if(L->head == NULL){
                    printf("\n[๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์‚ฝ์ž…๋ถ€ํ„ฐ ํ•ด์ฃผ์„ธ์š”.]\n\n");
                }else{
                    printf("\n[์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ํŠน์ • ์œ„์น˜์— ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋Š ๋ฐ์ดํ„ฐ ๋’ค์— ์ถ”๊ฐ€ํ• ๊นŒ์š”?]\n\n");
                    printf("๋ฐ์ดํ„ฐ ์„ ํƒ: ");
                    scanf("%d", &selectNodeData);
                    printf("\n");
                    additNode(L, selectNodeData, &nodeData);
                    printList(L);
                }
                break;
            case 3:
                if(L->head == NULL){
                    printf("\n[๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์‚ฝ์ž…๋ถ€ํ„ฐ ํ•ด์ฃผ์„ธ์š”.]\n\n");
                }else{
                    printf("\n[์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ• ๊นŒ์š”?]\n\n");
                    printf("๋ฐ์ดํ„ฐ ์„ ํƒ: ");
                    scanf("%d", &selectNodeData);
                    printf("\n");
                    deleteitNode(L, selectNodeData);
                    printList(L);
                }
                break;
            case 9:
                printf("\n[์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.]\n");
                break;
            default:
                printf("\n[์œ ํšจํ•˜์ง€ ์•Š์€ ๋ช…๋ น์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.]\n");
                break;
        }
    }
}

** ์ฐธ๊ณ  ๋ธ”๋กœ๊ทธ
์ดํ•ด๊ฐ€ ์•ˆ๋˜๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ฒจ์„œ ๋ง‰ํ˜”๋˜ ๋ถ€๋ถ„์€ ์•„๋ž˜ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ–ˆ๋‹ค.
https://blog.naver.com/simonmatthew/221304432762
https://massy2002.blog.me/12433974

โ† ์ด์ „ ๊ฒŒ์‹œ๋ฌผjekyll ๋ธ”๋กœ๊ทธ ๋กœ์ปฌ์—์„œ ํ™•์ธํ•˜๊ธฐ
๋‹ค์Œ ๊ฒŒ์‹œ๋ฌผ โ†’2018 SW์ œํ’ˆ ์‹œ์žฅ์„ฑํ…Œ์ŠคํŠธ ํ‰๊ฐ€๋‹จ์— ์ง€์›ํ–ˆ์Šต๋‹ˆ๋‹ค
๋ชฉ๋ก