template < class ItemType >
struct NodeType {
ItemType info;
NodeType* next;
};
template
class LLStackType {
public:
LLStackType();
~LLStackType();
bool IsFull();
bool IsEmpty();
void Push(ItemType);
void Pop();
ItemType Top();
private:
NodeType* topPtr;
};
template
LLStackType::LLStackType() {
topPtr = nullptr;
}
template
LLStackType::~LLStackType() {
NodeType tempPtr;
while (topPtr!=nullptr) {
tempPtr = topPtr;
topPtr = topPtr->next;
delete tempPtr;
}
}
template
bool LLStackType::IsFull() {
NodeType* location;
try {
location = new NodeType;
delete location;
return false;
}
catch (FullStack) {
return true;
}
}
template
bool LLStackType::IsEmpty() {
return (topPtr == nullptr);
}
template
ItemType LLStackType::Top() {
if (IsEmpty()) {
throw EmptyStack();
}
else {
return topPtr->info;
}
}
template
void LLStackType::Push(ItemType item) {
NodeType* temp;
temp = new NodeType;
temp->info = item;
temp->next = topPtr;
topPtr = temp;
}
tempPtr로 topPtr이 가리키는 노드를 가리키고, topPtr = topPtr->next (다음 순서의 지울 원소를 가리킨다)
이후, 기존의 노드였던 tempPtr를 delete
template
void LLStackType::Pop() {
if (IsEmpty())
throw EmptyStack();NodeType<ItemType>* temp; temp = topPtr; topPtr = topPtr->next; delete temp;
}
template
class LLQueueType {
public:
LLQueueType();
~LLQueueType();
bool IsFull() const;
bool IsEmpty() const;
void Enqueue(ItemType);
void Dequeue(ItemType& item);
void makeEmpty();
private:
NodeType* front;
NodeType* rear;
};
// Constructor!
template< class ItemType >
LLQueueType::LLQueueType() {
front = nullptr;
rear = nullptr;
}
template< class ItemType >
LLQueueType::~LLQueueType() {
while (!IsEmpty()) {
NodeType* tempPtr;
tempPtr = front;
front = front->next;
delete tempPtr;
}
}
template< class ItemType >
bool LLQueueType::IsFull() const {
try {
NodeType* temp;
temp = new NodeType;
delete temp;
}
catch (FullQueue);
}
template< class ItemType >
bool LLQueueType::IsEmpty() const {
return (front == rear);}
1) tempPtr로 새로운 노드(next는 nullptr)를 가리키고, 기존의 rear의 next에 새로운 노드를 연결시킨다
2) 이후 rear = tempPtr(Newnode)을 통해 rear의 위치를 1증가시킨다!
template< class ItemType >
void LLQueueType::Enqueue(ItemType item){
if (IsFull) { throw FullQueue(); }
else {
NodeType temp;
temp = new NodeType;
temp->info = item;
temp->next = nullptr;
if (rear == nullptr)
front = temp; // front가 nullptr이다가 처음 Node를 가리키는 경우!
else
rear->next = temp; // (if rear-> next == nullptr인 경우, 위의 예외처리)
rear = temp;
}
}
1) tempPtr로 지울 노드(front가 가리키는 노드)를 먼저 가리킨다
2) front = front->next를 통해 front의 위치를 1증가시킨다
3) 기존의 노드(tempPtr)을 delete한다
template
void LLQueueType::Dequeue(ItemType& item) {
if (IsEmpty) { throw EmptyQueue(); }
else {
NodeType* temp;
temp = front;
front = front->next;
item = temp->info;
if (front == nullptr) // 위의 action이후 front가 nullptr, front->next가 오류가 발생하므로 rear역시 null로 만들어주어 Isempty()조건에 걸리게 한다
rear = nullptr;
delete temp;
}
}
template< class ItemType >
void LLQueueType::makeEmpty() {
while (!IsEmpty()) {
NodeType* tempPtr;
tempPtr = front;
front = front->next;
delete tempPtr;
}
rear = nullptr;
}
template
class UnsortedType {
public:
UnsortedType();
~UnsortedType();
void makeEmpty();
bool IsFull() const;
int LengthIs() const;
void RetrieveItem(ItemType& item, bool& found);
void InsertItem(ItemType);
void DeleteItem(ItemType& item);
void ResetList();
void GetNextItem(ItemType& item);
private:
NodeType* listData;
int length;
NodeType* currentPos;
};
template
UnsortedType::UnsortedType() {
length = 0;
listData = nullptr;
}
template
int UnsortedType::LengthIs() const {
return length;}
template < class ItemType >
void UnsortedType::RetrieveItem(ItemType& item, bool& found) {
bool moreToSearch;
NodeType* location;
location = listData; // listData의 첫번째 element를 가리킨다
found = false;
moreToSearch = (location != nullptr); // location이 끝까지 안갔을때까지 실행
while (moreToSearch && !found) {
if (item == location->info) {
found = true;
item = location->info;
}
else {
location = location->next; // location ++
moreToSearch = (location != nullptr);
}
}
}
template < class ItemType >
void UnsortedType::InsertItem(ItemType item) {
NodeType* location;
location = new NodeType;
location->info = item;
location->next = listData;
listData = location;
length++;
}
-삭제할 node기준으로 좌우의 노드를 연결시켜줘야 한다->삭제할 노드를 가리키는 tempLoc, 삭제할 노드 이전을 가리키는 Loc을 알아야 한다
-Loc->next = tempLoc->next 한 이후에 노드를 삭제한다(순서 중요!)
template < class ItemType >
void UnsortedType::DeleteItem(ItemType& item) {
NodeType* location = listData;
NodeType* tempLoc;
bool found = false;
if (item == listData->info) {
tempLoc = location;
listData = listData->next; // Delete first node
}
else {
while (!(item == (location->next)->info))
location = location->next;
RetrieveItem(item, found); // item이 있는지 확인한다!
if (found) {
// delete node at location->next
tempLoc = location->next;
location->next = (location->next)->next; // 삭제될 원소의 오른쪽 원소를 point!
delete tempLoc;
length--;
}
else {
// item is not in list!
}
}
}
template < class ItemType >
void SortedType< ItemType >::RetrieveItem(ItemType& item, bool& found){
NodeType< ItemType >* location;
location = listData;
found = false;
while(location != nullptr && !found) {
if(location->info != item){
location = location->next;
}
else if(location->info == item){
found = true;
item = location -> info;
}
else{location = nullptr)
}
}