• 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 : ํด๋ž˜์Šค ๋ฉค๋ฒ„ ๋ฐ์ดํ„ฐ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋„ ๋”ฐ๋กœ ์ €์žฅํ•œ๋‹ค. ๋ณธ๋ž˜ ํด๋ž˜์Šค ๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜์™€ ๋‹ค๋ฅธ ๊ณณ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ฐ€๋ฆฌํ‚จ๋‹ค.

image

Shallow Copy

  • ๋‹ค์Œ์˜ ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?
void Func(StackType<ItemType> SomeStack){
	ItemType item;
	SomeStack.Pop(item);
}
 
// main
StackType<int> MyStack;
Func(MyStack);
  • Func์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋œ ์Šคํƒ์€ pass by value๋กœ ์ „๋‹ฌ๋๋‹ค.
  • ๋‹ค์Œ์˜ ๊ฒฝ์šฐ์—๋Š” Shallow Copy๊ฐ€ ์ ์šฉ๋œ๋‹ค.

image

  • ๊ฒฐ๊ณผ๋Š” ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™๋‹ค.
  • ์ˆœ์„œ
  1. MyStack์„ ์ „๋‹ฌํ•ด SomeStack์œผ๋กœ Shallow Copy๋ฅผ ํ•œ๋‹ค.
  2. ์ด๋•Œ SomeStack์˜ top์€ MyStack๊ณผ ๊ฐ™์€ ์œ„์น˜์˜ ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
  3. ์ด๋•Œ SomeStack.Pop(item)์œผ๋กœ ์ธํ•ด SomeStack์€ Pop์„ ํ•˜๊ณ  6000์˜ ์ฃผ์†Œ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
  4. ํ•˜์ง€๋งŒ, 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;
}