๐ฏ ์ฐ๊ฒฐ ์๋ฃ๊ตฌ์กฐ(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()