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

[Data Structures & Algorithms] ์›ํ˜• ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์™€ ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ (์›ํ˜• ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ & ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ์—ฐ์‚ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜)

by A Lim Han 2023. 6. 11.

๐ŸŽช ์›ํ˜• ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ž€?

๋‹จ์ˆœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊ฐ€ ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋ฒˆ์žฌ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•˜์—ฌ ๊ตฌ์กฐ๋ฅผ ์›ํ˜•์œผ๋กœ ์„ค์ •ํ•œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์›ํ˜• ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ผ๊ณ  ํ•œ๋‹ค.

๋‹จ์ˆœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์ด ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์˜ ๋งํฌ ํ•„๋“œ์— ์ฒซ ๋ฒˆ์งธ ๋…ธ๋“œ์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜์—ฌ, ๋งํฌ๋ฅผ ๋”ฐ๋ผ ๋ฐ˜๋ณต ์ˆœํšŒํ•  ์‹œ ์ด์ „ ๋…ธ๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 


 

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

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

insertFirstNode(CL, x)

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

 

 

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

insertMiddleNode(CL, pre, x)

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

 


 

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

deleteNode(CL, pre)

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

 


 

๐ŸŽช ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ž€?

 

์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์–‘์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋„๋ก ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ผ๊ณ  ํ•œ๋‹ค.

 

์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋…ธ๋“œ ๊ตฌ์กฐ
llink (Left Link) ํ•„๋“œ rlink (Right link) ํ•„๋“œ
์ขŒ์ธก ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐํ•˜๋Š” ํฌ์ธํ„ฐ ์šฐ์ธก ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐํ•˜๋Š” ํฌ์ธํ„ฐ

 


 

โค๏ธ ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๊ตฌ์กฐ์ฒด ์ •์˜

typedef struct Dnode
{
    struct Dnode *llink;
    char data[5];
    struct Dnode *rlink;
}

 


 

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

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

 

โ‘  ๋ฐ์ดํ„ฐ ํ•„๋“œ๊ฐ’์ด x์ธ ๋…ธ๋“œ new๋ฅผ ํฌ์ธํ„ฐ pre๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ๋กœ ์‚ฝ์ž…ํ•˜๋Š” ์—ฐ์‚ฐ

insertNode(DL, pre, x)

    new <- getNode();
    new.data <- x;
    
    new.rlink <- pre.rlink;
    pre.rlink <- new;
    new.llink <- pre;
    new.rlink.llink <- new;
    
end insertNode()

 


 

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

โ‘  ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ์šฐ์ธก ๋…ธ๋“œ์™€ ์ขŒ์ธก ๋…ธ๋“œ๋ฅผ ๊ฐ๊ฐ ์ฐพ๊ธฐ
โ‘ก ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ์šฐ์ชฝ ๋…ธ๋“œ ์ฃผ์†Œ๋ฅผ ์‚ญ์ œํ•  ๋…ธ๋“œ ๊ธฐ์ค€ ์ขŒ์ธก ๋…ธ๋“œ์˜ rlink์— ์ €์žฅ
โ‘ข ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ์™ผ์ชฝ ๋…ธ๋“œ์˜ ์ฃผ์†Œ๋ฅผ ์‚ญ์ œํ•  ๋…ธ๋“œ ๊ธฐ์ค€ ์šฐ์ธก ๋…ธ๋“œ์˜ llink์— ์ €์žฅ
โ‘ฃ ๋…ธ๋“œ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์—ฐ๊ฒฐ

 

deleteNode(DL, old)

    old.llink.rlink <- old.rlink;
    old.rlink.llink <- old.llink;
    
    returnNode(old);

end deleteNode()