- toc {:toc}
Sorted List using Doubly Linked List
- ์ด์ ๋จ๋ฐฉํฅ linked list์์๋ NodeType์ next๋ง ์ ์ฉ๋์ด ์๋ ๋ฐ๋ฉด doubly linked list๋ back, next 2๊ฐ์ง๊ฐ ์ ์ฉ๋์ด ์ด์ ํฌ์ธํฐ๋ ์ ์ฅํ๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋๋ค.
FindItem
- InsertItem, DeleteItem, RetrieveItem ๋ชจ๋ ํน์ item์ ์ฐพ๋ ๊ณผ์ ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ FindItem ํจ์๋ฅผ ์ ์ฉํ๋ค.(return location, found)
- FindItem precondition : ๋ฆฌ์คํธ๋ ๋น์ด์์ง ์๋๋ค.
template<class ItemType>
void FindItem(NodeType<ItemType>* listData, ItemType item,
NodeType<ItemType>* &location, bool &found){
bool moreToSearch = true;
location = listData;
found = false;
while(moreToSearch && !found){
if(item < location->info)
moreToSearch = false;
else if(item == location->info)
found = true;
else{
// location = location->next ๋งจ ๋์ ๋ ์ ์๊ธฐ์ ์๋๋ก ๋ณ๊ฒฝ
// moreToSearch = location!=NULL;
if(location->next == NULL)
moreToSearch = false;
else
location = location->next;
}
}
}- ์ํํ๋ฉฐ item๋ณด๋ค ์๋ค๋ฉด ๋ค์์ผ๋ก, ๊ฐ๋ค๋ฉด found flag๋ฅผ ํตํด์ while๋ฌธ ํ์ถ
- ์ ๋ ฌ๋์ด ์๋ ์ํ์ด๊ธฐ ๋๋ฌธ์ item๋ณด๋ค ์ํํ๋ ๊ฐ์ด ๋ ํฌ๋ค๋ฉด item์ ๋ง๋ ๊ฐ์ด ์๋ ๊ฒ์ด๋ฏ๋ก ํ์ํ ํ์๊ฐ ์๋ค.
- location, found๋ &๋ก ๋ฐ์ pass by reference๋ก ํจ์ ์์์ ์ง์ ๋๋ ๊ฐ์ ๊ทธ๋๋ก ๋ฐ์์ฌ ์ ์๋๋ก ํ๋ค.
InsertItem
template<class ItemType>
void InsertItem(ItemType item){
NodeType<ItemType>* newNode;
NodeType<ItemType>* location;
bool = found;
newNode = new NodeType<ItemType>;
newNode->info = item;
if(listData != NULL){ // list๊ฐ ์ฐจ ์๋ ๊ฒฝ์ฐ
FindItem(listData, item, location, found);
if(location->info > item){ // item์ด ์ค๊ฐ์ ์์นํ ๊ฒฝ์ฐ
newNode->back = location->back;
newNode->next = location;
if(location != listData){
location->back->next = newNode;
}
location->back = newNode;
}
else{ // item์ด end์ ์์นํ ๊ฒฝ์ฐ
newNode->back = location;
location->next = newNode;
newNode->next = NULL;
}
}
else{ // list๊ฐ ๋น ๊ฒฝ์ฐ
listData = newNode;
newNode->next = NULL;
newNode->back = NULL;
}
length++;
}- ์ด์ , ๋ค์ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ๋ณ๊ฒฝํ ๋ ๋ณด์ ํ ๊ฐ์ด ์ฌ๋ผ์ง์ง ์๋๋ก ์์์ ์ ์ํด์ผ ํ๋ค.
- newNodeโback = locationโback ์ฐ์
- locationโback = newNode ๋ค์
Headers and Trailers
- ์์, ๋ ์ง์ ์์ ์์ธ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ Header์ Trailer๋ฅผ ์ฌ์ฉํด์ ์์ธ๋ฅผ ๋ฐฐ์ ํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค.
- Idea : ๋ฆฌ์คํธ์ ์ ๋ ๋จ์ ์ ๋ ์ฝ์ , ์ญ์ ๋ฅผ ํ์ง ์๋๋ก ๋ง๋ ๋ค.
- Method : ์ ๋ ๋จ์ ๊ฐ๋ฅํ ๊ฐ์ ๋ฒ์๋ฅผ ์ด๊ณผํ dummy ๋ ธ๋๋ฅผ ๋ง๋ ๋ค.
- Header : ๊ฐ๋ฅํ ๋ฆฌ์คํธ ๊ฐ๋ณด๋ค ๋ ์์ ๊ฐ์ ํฌํจํ๋ค.
- Trailer : ๊ฐ๋ฅํ ๋ฆฌ์คํธ ๊ฐ๋ณด๋ค ๋ ํฐ ๊ฐ์ ํฌํจํ๋ค.
Shallow Copy / Deep Copy
- Shallow Copy : ํด๋์ค ๋ฉค๋ฒ ๋ฐ์ดํฐ๋ง ๋ณต์ฌํ๊ณ , ๊ฐ๋ฆฌํค๊ณ ์๋ ๋ฐ์ดํฐ๋ ๋ณต์ฌํ์ง ์๋๋ค. ์ฆ, ๊ฐ๋ฆฌํค๊ณ ์๋ ๋ฐ์ดํฐ๋ ๋ณธ๋ ํด๋์ค ๊ฐ์ฒด์ ๊ณต์ ํ๋ค.
- Deep Copy : ํด๋์ค ๋ฉค๋ฒ ๋ฐ์ดํฐ ๋ฟ๋ง ์๋๋ผ ๊ฐ๋ฆฌํค๊ณ ์๋ ๋ฐ์ดํฐ๋ ๋ฐ๋ก ์ ์ฅํ๋ค. ๋ณธ๋ ํด๋์ค ๊ฐ์ฒด์ ๋ฐ์ดํฐ์ ์์น์ ๋ค๋ฅธ ๊ณณ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ฐ๋ฆฌํจ๋ค.
Shallow Copy
- ๋ค์์ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ๋ ๊น?
void Func(StackType<ItemType> SomeStack){
ItemType item;
SomeStack.Pop(item);
}
// main
StackType<int> MyStack;
Func(MyStack);- Func์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ ์คํ์ pass by value๋ก ์ ๋ฌ๋๋ค.
- ๋ค์์ ๊ฒฝ์ฐ์๋ Shallow Copy๊ฐ ์ ์ฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ๋ค.
- ์์
- MyStack์ ์ ๋ฌํด SomeStack์ผ๋ก Shallow Copy๋ฅผ ํ๋ค.
- ์ด๋ SomeStack์ top์ MyStack๊ณผ ๊ฐ์ ์์น์ ๊ฐ์ ๊ฐ๋ฆฌํจ๋ค.
- ์ด๋ SomeStack.Pop(item)์ผ๋ก ์ธํด SomeStack์ Pop์ ํ๊ณ 6000์ ์ฃผ์๊ฐ์ ๊ฐ๋ฆฌํจ๋ค.
- ํ์ง๋ง, MyStack์ ๊ฒฝ์ฐ ์ฌ์ ํ 7000 ์ฃผ์๊ฐ์ ๊ฐ๋ฆฌํค๊ณ ์๊ฒ ๋๋ค.
Deep Copy
-
๊ธฐ๋ณธ ์์ฑ์๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ pass by value๋ก ์์ฑ๋๋ค.
-
ํฌ์ธํฐ๊ฐ ๋์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ฆฌํฌ ๋ pass by value ์ฆ, Shallow Copy์ ๊ฒฝ์ฐ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ ๋ณต์ฌํ์ง ๋ชปํ๋ฏ๋ก ์์ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
-
๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์์ ๋์ ๋ฐ์ดํฐ์ Deep Copy๋ฅผ ๋ง๋๋ copy constructor๋ฅผ ํด๋์ค์ ๋ง๋ค์ด ์ฌ์ฉํด์ผ ํ๋ค.
-
Copy constructor
- Pass by reference๋ฅผ ์ฌ์ฉํ๋ค.
- Copy constructor๋ฅผ ๋ง๋ค์ด ๋ ๊ฒฝ์ฐ, pass by value๋ก ๋ณต์ฌ๋ฅผ ํ๋๋ผ๋ ์๋ฌต์ ์ผ๋ก copy constructor๊ฐ ํธ์ถ๋์ด ๋ณต์ฌ๋๋ค.
template<class ItemType>
class StackType{
public:
StackType(){
cout << "Default Constructor" << endl;
};
StackType(const StackType<ItemType>& anotherStack);
// Copy constructor
{
cout << "Copy Constructor" << endl;
.
.
.
}
~StackType();
private:
NodeType<ItemType>* topPtr;
}
int main(){
StackType<int> SomeStack;
SomeStack.Push(1);
StackType<int> AnotherStack(SomeStack);
}
// Result
// Default Constructor
// Copy Constructor-
์ ํ๋ผ๋ฏธํฐ๋ฅผ const๋ก ์ง์ ํ ๊น?
-
const๋ก ํ๋ผ๋ฏธํฐ๋ฅผ ์ง์ ํ๋ฉด ํด๋น ํ๋ผ๋ฏธํฐ๋ ๋ณํ์ ๊ฐํ ์ ์๋ค.
-
ํ์ง๋ง copy constructor์ ๊ฒฝ์ฐ ๊ฐ์ ๋ณํ์ํค์ง ์๊ณ ๋ณต์ฌ๋ฅผ ํ๋ ์ญํ ์ ํ๊ธฐ ๋๋ฌธ์ const๋ก ๋ช ํํ๊ฒ ๋ช ์ํ๋ค.
-
Copy constructor๋ ๋ค์์ 3๊ฐ์ง ์ํฉ์์ ์๋ฌต์ ์ผ๋ก ํธ์ถ๋๋ ํน์ํ ๋ฉค๋ฒ ํจ์์ด๋ค.
- ๊ฐ์ฒด ํ๋ผ๋ฏธํฐ๋ฅผ value๋ก ์ ๋ฌํ๋ ๊ฒฝ์ฐ
- ์ ์ธ์์ ๊ฐ์ฒด ๋ณ์๋ฅผ ์ด๊ธฐํํ๋ ๊ฒฝ์ฐ
- ํจ์์ ๋ฐํ๊ฐ์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ
Assignment Operator =
- ๋ง์ฝ, ํด๋์ค๊ฐ ๋์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ฐ์ดํฐ ๋ฉค๋ฒ ํฌ์ธํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด ๋์ ๋ฐ์ดํฐ์ Deep Copy๋ฅผ ๋ง๋๋ ํ ๋น ์ฐ์ฐ์๋ฅผ ์์ฑํด์ผ ํ๋ค.
template<class ItemType>
class StackType{
public:
StackType();
StackType(const StackType<ItemType>& anotherStack);
// Copy constructor
void operator= (const StackType<itemType>& originalStack);
~StackType();
private:
NodeType<ItemType>* topPtr;
}