๐ช ์ํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋?
๋จ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์์ ๋ง์ง๋ง ๋ ธ๋๊ฐ ๋ฆฌ์คํธ์ ์ฒซ ๋ฒ์ฌ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ํ์ฌ ๊ตฌ์กฐ๋ฅผ ์ํ์ผ๋ก ์ค์ ํ ๋ฆฌ์คํธ๋ฅผ ์ํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ผ๊ณ ํ๋ค.
๋จ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ด ๋ง์ง๋ง ๋ ธ๋์ ๋งํฌ ํ๋์ ์ฒซ ๋ฒ์งธ ๋ ธ๋์ ์ฃผ์๋ฅผ ์ ์ฅํ์ฌ, ๋งํฌ๋ฅผ ๋ฐ๋ผ ๋ฐ๋ณต ์ํํ ์ ์ด์ ๋ ธ๋์ ์ ๊ทผํ ์ ์๋ค.
โค๏ธ ์ํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ์๊ณ ๋ฆฌ์ฆ_ 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()