Adding Last few classed of C++ custom Data Structures
This commit is contained in:
163
Data Structures C++/Queue.h
Normal file
163
Data Structures C++/Queue.h
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
Queues use FIFO (First In, First Out) ordering
|
||||||
|
LILO (Last In, Last Out)
|
||||||
|
|
||||||
|
Ex: car wash, midnight release of a game, a line at an amusement park, etc.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
// Keeps the class generic
|
||||||
|
//typedef int Item;
|
||||||
|
|
||||||
|
|
||||||
|
template<typename Item>
|
||||||
|
class Queue
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
struct Node
|
||||||
|
{
|
||||||
|
Item m_data; // The value to store
|
||||||
|
Node* m_next; // The next one in the list
|
||||||
|
|
||||||
|
// Ctor
|
||||||
|
Node(const Item& _info);
|
||||||
|
};
|
||||||
|
|
||||||
|
Node* m_head; // The oldest node in the list
|
||||||
|
Node* m_tail; // The newest node in the list
|
||||||
|
|
||||||
|
int m_currSize; // Current number of nodes allocated
|
||||||
|
const int m_maxSize;// Max number to store at any given time
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Def ctor
|
||||||
|
// In: _maxSize The max size for *THIS* particular queue
|
||||||
|
Queue(int _maxSize = 0); // 0 will represent unlimited
|
||||||
|
|
||||||
|
// Dtor
|
||||||
|
~Queue();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
// Disabled copy ctor
|
||||||
|
Queue(const Queue& _q) : m_maxSize(0) { }
|
||||||
|
|
||||||
|
// Disabled assignment operator
|
||||||
|
Queue& operator=(const Queue& q) { return *this; }
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int GetCurrSize() const { return m_currSize; }
|
||||||
|
|
||||||
|
// Add an Item to the end of the queue
|
||||||
|
// In: _info The Item to add
|
||||||
|
//
|
||||||
|
// Return: True, if something was added
|
||||||
|
bool Enqueue(const Item& _info);
|
||||||
|
|
||||||
|
// Remove the Item from the front of the queue
|
||||||
|
// In: _info A "blank" Item
|
||||||
|
//
|
||||||
|
// Out: _info The Item at the front
|
||||||
|
// Return: True, if something was removed
|
||||||
|
bool Dequeue(Item& _info);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Ctor
|
||||||
|
template<typename Item>
|
||||||
|
Queue<Item>::Node::Node(const Item& _info)
|
||||||
|
{
|
||||||
|
m_data = _info;
|
||||||
|
m_next = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Def ctor
|
||||||
|
//
|
||||||
|
// Const data members have to use the member initializer
|
||||||
|
template<typename Item>
|
||||||
|
Queue<Item>::Queue(int _maxSize) : m_maxSize(_maxSize)
|
||||||
|
{
|
||||||
|
m_head = m_tail = NULL;
|
||||||
|
m_currSize = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dtor
|
||||||
|
template<typename Item>
|
||||||
|
Queue<Item>::~Queue()
|
||||||
|
{
|
||||||
|
for (Node* temp = m_head; temp; temp = m_head)
|
||||||
|
{
|
||||||
|
m_head = m_head->m_next;
|
||||||
|
delete temp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Add an Item to the end of the queue
|
||||||
|
// In: _info The Item to add
|
||||||
|
//
|
||||||
|
// Return: True, if something was added
|
||||||
|
template<typename Item>
|
||||||
|
bool Queue<Item>::Enqueue(const Item& _info)
|
||||||
|
{
|
||||||
|
// Is the list full?
|
||||||
|
if (m_maxSize != 0 && m_maxSize == m_currSize)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Allocate space to store the information
|
||||||
|
Node* newest = new Node(_info);
|
||||||
|
|
||||||
|
// Did we run out of memory?
|
||||||
|
if (NULL == newest)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// If the list is currently empty, set the head and tail pointer
|
||||||
|
if (!m_head)
|
||||||
|
{
|
||||||
|
m_head = newest;
|
||||||
|
m_tail = newest;
|
||||||
|
}
|
||||||
|
// Otherwise, go to the end of the list
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_tail->m_next = newest;
|
||||||
|
m_tail = newest;
|
||||||
|
}
|
||||||
|
|
||||||
|
++m_currSize;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove the Item from the front of the queue
|
||||||
|
// In: _info A "blank" Item
|
||||||
|
//
|
||||||
|
// Out: _info The Item at the front
|
||||||
|
// Return: True, if something was removed
|
||||||
|
template<typename Item>
|
||||||
|
bool Queue<Item>::Dequeue(Item& _info)
|
||||||
|
{
|
||||||
|
// If the list is empty, GTFO
|
||||||
|
if (!m_head)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Copy over our value
|
||||||
|
_info = m_head->m_data;
|
||||||
|
|
||||||
|
// Update the list
|
||||||
|
Node* temp = m_head;
|
||||||
|
m_head = m_head->m_next;
|
||||||
|
delete temp;
|
||||||
|
|
||||||
|
m_currSize--;
|
||||||
|
return true;
|
||||||
|
}
|
243
Data Structures C++/SLList.h
Normal file
243
Data Structures C++/SLList.h
Normal file
@ -0,0 +1,243 @@
|
|||||||
|
#pragma once
|
||||||
|
template<typename Type> class SLLIter;
|
||||||
|
|
||||||
|
template<typename Type>
|
||||||
|
class SLList
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
struct Node
|
||||||
|
{
|
||||||
|
Type Data;
|
||||||
|
Node* m_next = nullptr;
|
||||||
|
Node(){ Data = nullptr; }
|
||||||
|
Node(Type _data){ Data = _data; }
|
||||||
|
};
|
||||||
|
Node* m_head;
|
||||||
|
int m_size;
|
||||||
|
public:
|
||||||
|
friend class SLLIter<Type>;
|
||||||
|
SLList();
|
||||||
|
~SLList();
|
||||||
|
SLList<Type>& operator=(const SLList<Type>& that);
|
||||||
|
SLList(const SLList<Type>& that);
|
||||||
|
void addHead(const Type& v);
|
||||||
|
void clear();
|
||||||
|
void insert(SLLIter<Type>& index, const Type& v);
|
||||||
|
void remove(SLLIter<Type>& index);
|
||||||
|
unsigned int size() const{ return m_size; }
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
template<typename Type>
|
||||||
|
SLList<Type>::SLList()
|
||||||
|
{
|
||||||
|
m_head = nullptr;
|
||||||
|
m_size = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
template<typename Type>
|
||||||
|
SLList<Type>::~SLList()
|
||||||
|
{
|
||||||
|
clear();
|
||||||
|
}
|
||||||
|
template<typename Type>
|
||||||
|
SLList<Type>& SLList<Type>::operator=(const SLList<Type>& that)
|
||||||
|
{
|
||||||
|
if (this != &that )
|
||||||
|
{
|
||||||
|
clear();
|
||||||
|
if (that.m_size > 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
m_head = new Node(that.m_head->Data);
|
||||||
|
Node* temp2;
|
||||||
|
Node* temp3;
|
||||||
|
temp2 = that.m_head->m_next;
|
||||||
|
temp3 = m_head;
|
||||||
|
for (int loop = 0; loop < that.m_size - 1; loop++)
|
||||||
|
{
|
||||||
|
Node* temp = new Node(temp2->Data);
|
||||||
|
temp2 = temp2->m_next;
|
||||||
|
temp3->m_next = temp;
|
||||||
|
temp3 = temp3->m_next;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
m_size = that.m_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
template<typename Type>
|
||||||
|
SLList<Type>::SLList(const SLList<Type>& that)
|
||||||
|
{
|
||||||
|
if (m_size > 0)
|
||||||
|
clear();
|
||||||
|
if (that.m_size > 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
m_head = new Node(that.m_head->Data);
|
||||||
|
Node* temp2;
|
||||||
|
Node* temp3;
|
||||||
|
temp2 = that.m_head->m_next;
|
||||||
|
temp3 = m_head;
|
||||||
|
for (int loop = 0; loop < that.m_size - 1; loop++)
|
||||||
|
{
|
||||||
|
Node* temp = new Node(temp2->Data);
|
||||||
|
temp2 = temp2->m_next;
|
||||||
|
temp3->m_next = temp;
|
||||||
|
temp3 = temp3->m_next;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
m_size = that.m_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
template<typename Type>
|
||||||
|
void SLList<Type>::addHead(const Type& v)
|
||||||
|
{
|
||||||
|
Node* temp = new Node(v);
|
||||||
|
temp->m_next = m_head;
|
||||||
|
m_head = temp;
|
||||||
|
m_size++;
|
||||||
|
}
|
||||||
|
template<typename Type>
|
||||||
|
void SLList<Type>::clear()
|
||||||
|
{
|
||||||
|
if (m_head != nullptr)
|
||||||
|
{
|
||||||
|
Node* temp;
|
||||||
|
temp = m_head;
|
||||||
|
while (m_head)
|
||||||
|
{
|
||||||
|
m_head = m_head->m_next;
|
||||||
|
delete temp;
|
||||||
|
temp = m_head;
|
||||||
|
m_size--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Type>
|
||||||
|
void SLList<Type>::insert(SLLIter<Type>& index, const Type& v)
|
||||||
|
{
|
||||||
|
if (m_size > 0)
|
||||||
|
{
|
||||||
|
Node* temp = new Node(v);
|
||||||
|
if (index.m_cur == nullptr)
|
||||||
|
{
|
||||||
|
if (index.m_prev != nullptr)
|
||||||
|
{
|
||||||
|
index.m_prev->m_next = temp;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
delete temp;
|
||||||
|
}
|
||||||
|
else if (index.m_cur == m_head)
|
||||||
|
{
|
||||||
|
|
||||||
|
temp->m_next = index.m_cur;
|
||||||
|
m_head = temp;
|
||||||
|
index.m_cur = m_head;
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
index.m_prev->m_next = temp;
|
||||||
|
temp->m_next = index.m_cur;
|
||||||
|
index.m_cur = index.m_prev->m_next;
|
||||||
|
}
|
||||||
|
m_size++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Type>
|
||||||
|
void SLList<Type>::remove(SLLIter<Type>& index)
|
||||||
|
{
|
||||||
|
if (index.m_cur != nullptr || index.m_prev != nullptr)
|
||||||
|
{
|
||||||
|
if (m_size > 0)
|
||||||
|
{
|
||||||
|
if (index.m_cur == m_head)
|
||||||
|
{
|
||||||
|
index.m_cur = index.m_cur->m_next;
|
||||||
|
delete m_head;
|
||||||
|
m_head = index.m_cur;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (index.m_cur == nullptr)
|
||||||
|
{
|
||||||
|
delete index.m_prev->m_next;
|
||||||
|
index.m_prev = nullptr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
index.m_prev->m_next = index.m_cur->m_next;
|
||||||
|
delete index.m_cur;
|
||||||
|
index.m_cur = index.m_prev->m_next;
|
||||||
|
}
|
||||||
|
m_size--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Type>
|
||||||
|
class SLLIter
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
typename SLList<Type>::Node * m_prev, *m_cur;
|
||||||
|
typename SLList<Type>& m_temp;
|
||||||
|
friend class SLList<Type>;
|
||||||
|
int count = 0;
|
||||||
|
public:
|
||||||
|
|
||||||
|
SLLIter(SLList<Type>& listToIterate);
|
||||||
|
void begin();
|
||||||
|
bool end() const;
|
||||||
|
SLLIter<Type>& operator++();
|
||||||
|
Type& current() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename Type>
|
||||||
|
SLLIter<Type>::SLLIter(SLList<Type>& listToIterate) : m_temp(listToIterate)
|
||||||
|
{
|
||||||
|
m_cur = m_temp.m_head;
|
||||||
|
m_prev = nullptr;
|
||||||
|
}
|
||||||
|
template<typename Type>
|
||||||
|
void SLLIter<Type>::begin()
|
||||||
|
{
|
||||||
|
m_prev = nullptr;
|
||||||
|
m_cur = m_temp.m_head;
|
||||||
|
}
|
||||||
|
template<typename Type>
|
||||||
|
bool SLLIter<Type>::end() const
|
||||||
|
{
|
||||||
|
|
||||||
|
if (m_cur == nullptr)
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
template<typename Type>
|
||||||
|
SLLIter<Type>& SLLIter<Type>::operator++()
|
||||||
|
{
|
||||||
|
if (m_cur != nullptr)
|
||||||
|
{
|
||||||
|
m_cur = m_cur->m_next;
|
||||||
|
|
||||||
|
if (m_prev == nullptr)
|
||||||
|
m_prev = m_temp.m_head;
|
||||||
|
else
|
||||||
|
m_prev = m_prev->m_next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
template<typename Type>
|
||||||
|
Type& SLLIter<Type>::current() const
|
||||||
|
{
|
||||||
|
return m_cur->Data;
|
||||||
|
}
|
124
Data Structures C++/Stack.h
Normal file
124
Data Structures C++/Stack.h
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "Card.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef Card Item;
|
||||||
|
|
||||||
|
// A singly linked list with FILO ordering
|
||||||
|
template<typename Item>
|
||||||
|
class Stack
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
struct Node
|
||||||
|
{
|
||||||
|
Item m_data;
|
||||||
|
Node* m_next;
|
||||||
|
};
|
||||||
|
|
||||||
|
Node* m_top;
|
||||||
|
int m_currSize;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Default ctor
|
||||||
|
Stack();
|
||||||
|
|
||||||
|
// Dtor
|
||||||
|
~Stack();
|
||||||
|
|
||||||
|
|
||||||
|
int GetCurrSize() const { return m_currSize; }
|
||||||
|
|
||||||
|
|
||||||
|
bool Push(const Item& _info);
|
||||||
|
|
||||||
|
|
||||||
|
bool Pop(Item& _info);
|
||||||
|
|
||||||
|
|
||||||
|
void Clear();
|
||||||
|
|
||||||
|
|
||||||
|
const Item* Peek() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Default ctor
|
||||||
|
template<typename Item>
|
||||||
|
Stack<Item>::Stack()
|
||||||
|
{
|
||||||
|
m_currSize = 0;
|
||||||
|
m_top = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dtor
|
||||||
|
template<typename Item>
|
||||||
|
Stack<Item>::~Stack()
|
||||||
|
{
|
||||||
|
Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Item>
|
||||||
|
bool Stack<Item>::Push(const Item& _info)
|
||||||
|
{
|
||||||
|
// Make space for this new data
|
||||||
|
Node* newTop = new Node;
|
||||||
|
|
||||||
|
// Did new fail?
|
||||||
|
if (!newTop)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Fill in the node
|
||||||
|
newTop->m_data = _info;
|
||||||
|
newTop->m_next = m_top;
|
||||||
|
|
||||||
|
// Update the top pointer
|
||||||
|
m_top = newTop;
|
||||||
|
|
||||||
|
m_currSize++;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Item>
|
||||||
|
bool Stack<Item>::Pop(Item& _info)
|
||||||
|
{
|
||||||
|
// Is the list empty?
|
||||||
|
if (NULL == m_top)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Copy over the value
|
||||||
|
_info = m_top->m_data;
|
||||||
|
|
||||||
|
// Update the stack
|
||||||
|
Node* temp = m_top;
|
||||||
|
m_top = m_top->m_next;
|
||||||
|
delete temp;
|
||||||
|
|
||||||
|
m_currSize--;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Empty out the stack for re-use
|
||||||
|
template<typename Item>
|
||||||
|
void Stack<Item>::Clear()
|
||||||
|
{
|
||||||
|
Node* temp = m_top;
|
||||||
|
|
||||||
|
// Loop until all nodes have been de
|
||||||
|
while (m_top)
|
||||||
|
{
|
||||||
|
m_top = m_top->m_next;
|
||||||
|
delete temp;
|
||||||
|
temp = m_top;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_currSize = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Look at the top thing without removing it
|
||||||
|
template<typename Item>
|
||||||
|
const Item* Stack<Item>::Peek() const
|
||||||
|
{
|
||||||
|
return (m_top ? &m_top->m_data : NULL);
|
||||||
|
}
|
Reference in New Issue
Block a user