๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โœ’๏ธ Data Structures & Algorithms

[Data Structures & Algorithms] ์—ฐ๊ฒฐ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ (๋‹จ์ˆœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์™€ ์—ฐ์‚ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜)

by A Lim Han 2023. 6. 10.

๐ŸŽฏ ์—ฐ๊ฒฐ ์ž๋ฃŒ๊ตฌ์กฐ(Linked Data Structure)๋ž€?

์—ฐ๊ฒฐ ์ž๋ฃŒ๊ตฌ์กฐ๋ž€ ์ž๋ฃŒ์˜ ๋…ผ๋ฆฌ์  ์ˆœ์„œ์™€ ๋ฌผ๋ฆฌ์  ์ˆœ์„œ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋งํ•œ๋‹ค.

๊ฐ ์›์†Œ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋‹ค์Œ ์›์†Œ์˜ ์ฃผ์†Œ์— ์˜ํ•ด ์ˆœ์„œ๊ฐ€ ์—ฐ๊ฒฐ๋˜๋ฏ€๋กœ, ๋ฌผ๋ฆฌ์  ์ˆœ์„œ๋ฅผ ๋งž์ถ”๊ธฐ ์œ„ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.

 


 

๐ŸŽฏ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Linked List)๋ž€?

๋ฆฌ์ŠคํŠธ๋ฅผ ์—ฐ๊ฒฐ ์ž๋ฃŒ๊ตฌ์กฐ ํ˜•์‹์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์„ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Linked List)๋ผ๊ณ  ํ•˜๋ฉฐ, ์—ฐ๊ฒฐ ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋‹จ์ˆœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ, ์›ํ˜• ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ, ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ, ์ด์ค‘ ์›ํ˜• ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 


 

โค๏ธ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋…ธ๋“œ

: ์—ฐ๊ฒฐ ์ž๋ฃŒ๊ตฌ์กฐ์—์„œ ํ•˜๋‚˜์˜ ์›์†Œ๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๋‹จ์œ„ ๊ตฌ์กฐ

 

๋…ธ๋“œ์˜ ๋…ผ๋ฆฌ์  ๊ตฌ์กฐ
๋ฐ์ดํ„ฐ ํ•„๋“œ (Data field) ๋งํฌ ํ•„๋“œ (Link field)
์›์†Œ์˜ ๊ฐ’ ์ €์žฅ ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ฃผ์†Œ ์ €์žฅ
์ €์žฅํ•  ์›์†Œ ํ˜•ํƒœ์— ๋”ฐ๋ผ 1๊ฐœ ์ด์ƒ์˜ ํ•„๋“œ๋กœ ๊ตฌ์„ฑ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฃผ์†Œ๊ฐ’ ์ €์žฅ

 


 

๐ŸŽฏ๋‹จ์ˆœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ (Singly Linked List)๋ž€?

๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜์˜ ๋งํฌ ํ•„๋“œ์— ์˜ํ•ด ๋‹ค์Œ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋˜๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‹จ์ˆœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Singly Linked List)๋ผ๊ณ  ํ•œ๋‹ค.

 


 

โค๏ธ ๋‹จ์ˆœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์•Œ๊ณ ๋ฆฌ์ฆ˜_ 1) ์‚ฝ์ž… ์—ฐ์‚ฐ

โ‘  ์‚ฝ์ž…ํ•  ๋…ธ๋“œ ์ค€๋น„  ==  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น
โ‘ก ์ƒˆ ๋…ธ๋“œ์˜ ๋ฐ์ดํ„ฐ ํ•„๋“œ์— ๊ฐ’ ์ €์žฅ  ==  ๊ฐ’ ์ง€์ •
โ‘ข ์ƒˆ ๋…ธ๋“œ์˜ ๋งํฌ๊ฐ’ ์ง€์ •  ==  ์—ฐ๊ฒฐ
โ‘ฃ ๋ฆฌ์ŠคํŠธ์˜ ์•ž ๋…ธ๋“œ์— ์ƒˆ ๋…ธ๋“œ ์—ฐ๊ฒฐ  ==  ์—ฐ๊ฒฐ

 

โ‘  ์ฒซ ๋ฒˆ์งธ ๋…ธ๋“œ๋กœ ์‚ฝ์ž…ํ•˜๊ธฐ

insertFirstNode(L, x)

    new <- getNode(); //๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น
    new.data <- x; //๊ฐ’ ์ง€์ •
    new.link <- L; //๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ๋…ธ๋“œ ์ฃผ์†Œ๋ฅผ ์ƒˆ ๋…ธ๋“œ์˜ ๋งํฌ ํ•„๋“œ์— ์ €์žฅ
    L <- new; //์ฒซ ๋ฒˆ์งธ ๋…ธ๋“œ ์ฃผ์†Œ ๊ฐ€์ง„ ํฌ์ธํ„ฐ L์— ์ƒˆ ๋…ธ๋“œ ์ฃผ์†Œ ์ €์žฅ
    
end insertFirstNode()

 

 

โ‘ก ์ค‘๊ฐ„ ๋…ธ๋“œ๋กœ ์‚ฝ์ž…ํ•˜๊ธฐ

insertMiddleNode(L, pre, x)

    new <- getNode(); //๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น
    new.data <- x; //๊ฐ’ ์ง€์ •
    
    if(L = NULL) then //๊ณต๋ฐฑ ๋ฆฌ์ŠคํŠธ์ธ ๊ฒฝ์šฐ
    {
        L <- new; //์ƒˆ ๋…ธ๋“œ ์ฃผ์†Œ๋ฅผ ๋ฆฌ์ŠคํŠธ ํฌ์ธํ„ฐ์— ์ €์žฅ
        new.link <-NULL; //๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์˜ ๋งํฌ ํ•„๋“œ์— NULL๊ฐ’ ์ €์žฅ
    }
    else
    {
        new.link <- pre.link; //๋…ธ๋“œ pre์˜ ๋งํฌ ํ•„๋“œ๊ฐ’์„ new์˜ ๋งํฌ ํ•„๋“œ์— ์ €์žฅ
        pre.link <- new; //ํฌ์ธํ„ฐ new๊ฐ’์„ pre์˜ ๋งํฌ ํ•„๋“œ์— ์ €์žฅ
    }
    
end insertMiddleNode()

 

 

โ‘ข ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋กœ ์‚ฝ์ž…ํ•˜๊ธฐ

insertLastNode(L, x)

    new <- getNode();
    new.data <- x;
    new.link <- NULL //๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ˆ๊นŒ NULL ๊ฐ’ ํ• ๋‹น
    
    if (L = NULL) then //๊ณต๋ฐฑ ๋ฆฌ์ŠคํŠธ์ธ ๊ฒฝ์šฐ
    {
        L <- new; //๋ฆฌ์ŠคํŠธ ํฌ์ธํ„ฐ L์— ์ƒˆ ๋…ธ๋“œ์˜ ์ฃผ์†Œ ์ €์žฅ
        return;
    }
    
    temp <- L; //์ž„์‹œํฌ์ธํ„ฐ temp์— ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ๋…ธ๋“œ ์ฃผ์†Œ ์ง€์ •
    
    while (temp.link != NULL) do //๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ๋งํฌ ํ•„๋“œ๋ฅผ ๋”ฐ๋ผ ์ด๋™
    {
        temp <- temp.link;
    }
    
    temp.link <- new;
    
end insertLastNode();

 


 

โค๏ธ ๋‹จ์ˆœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์•Œ๊ณ ๋ฆฌ์ฆ˜_ 2) ์‚ญ์ œ ์—ฐ์‚ฐ

โ‘  ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ์•ž ๋…ธ๋“œ ํƒ์ƒ‰
โ‘ก ์•ž ๋…ธ๋“œ์— ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ๋งํฌ ํ•„๋“œ๊ฐ’ ์ €์žฅ
โ‘ข ์‚ญ์ œํ•œ ๋…ธ๋“œ์˜ ์•ž ๋…ธ๋“œ์™€ ์‚ญ์ œํ•œ ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ ์—ฐ๊ฒฐ

 

โ‘  ๋ฆฌ์ŠคํŠธ L์—์„œ ํฌ์ธํ„ฐ pre๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ(old)๋ฅผ ์‚ญ์ œํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

deleteNode(L, pre)

    if (L == NULL) then error; //๊ณต๋ฐฑ ๋ฆฌ์ŠคํŠธ์ธ ๊ฒฝ์šฐ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ
    else //๊ณต๋ฐฑ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ
    {
        old <- pre.link; //pre์˜ ๋‹ค์Œ ๋…ธ๋“œ ์ฃผ์†Œ๋ฅผ ํฌ์ธํ„ฐ old์— ์ €์žฅ
        if (old = NULL) then return; //pre๊ฐ€ ๋ฆฌ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ
        pre.link <- old.link; //pre๊ฐ€ ๋ฆฌ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ์‚ญ์ œ ์ง„ํ–‰
        returnNode(old); //์‚ญ์ œํ•œ ๋…ธ๋“œ old์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ˜ํ™˜
    }
    
end deleteNode()

 


 

โค๏ธ ๋‹จ์ˆœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์•Œ๊ณ ๋ฆฌ์ฆ˜_ 3) ๋…ธ๋“œ ํƒ์ƒ‰ ์—ฐ์‚ฐ

โ‘  ๋…ธ๋“œ x ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜

searchNode(L, x)
    
    temp <- L;
    
    while (temp != NULL) do //์ˆœํšŒ ํฌ์ธํ„ฐ temp๊ฐ€ NULL์ด ์•„๋‹Œ ๊ฒฝ์šฐ
    {
        if (temp.data == x)
        {
            return temp;
        }
        else
        {
            temp <- temp.link;
        }
    }
    
    return temp;
    
end searchNode()