1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
|
#include <iostream>
#include <random>
#include <vector>
#include <chrono>
#include <algorithm>
constexpr auto SIZE = 20;
constexpr auto low_bound = -500;
constexpr auto up_bound = 500;
struct Node
{
int m_data = 0;
Node* m_prev = nullptr;
Node* m_next = nullptr;
Node() {}
Node (const int& data) : m_data (data){}
Node(const int& data, Node* prev, Node* next)
: m_data(data), m_prev(prev), m_next(next) {}
~Node() {std::cout << "Goodbye " << m_data << "\n";}
};
struct DoublyList
{
size_t m_counter = 0;
Node* m_first = nullptr;
Node* m_last = nullptr;
DoublyList(){}
~DoublyList();
void insertInOrder(const int& data);
void display()const;
};
int main()
{
auto seed = std::chrono::system_clock::now().time_since_epoch().count();//seed
std::default_random_engine dre(seed);//engine
std::uniform_int_distribution<int> di(low_bound,up_bound);//distribution
std::vector<int> data(SIZE);
std::generate(data.begin(), data.end(), [&dre, &di]{ return di(dre);});
//http://en.cppreference.com/w/cpp/algorithm/generate
DoublyList dl{};
for (const auto& elem : data)dl.insertInOrder(elem);
dl.display();
}
void DoublyList::insertInOrder(const int& data)
{
if(!m_first)//list is empty
{
Node* temp = new Node(data);
m_first = m_last = temp;
++m_counter;
}
else
{
if(data <= m_first -> m_data)//data <= list first, so insert in front ...
{
Node* temp = new Node(data, nullptr, m_first);
m_first -> m_prev = temp;
m_first = temp;
++m_counter;
}
else //... else iterate through list to find where to insert data
{
Node* data_checker = m_first;
bool inserted = false;
while (data_checker -> m_next)
{
if(data <= data_checker -> m_next -> m_data)
{
Node* temp = new Node(data, data_checker, data_checker -> m_next);
temp -> m_next -> m_prev = temp;
temp -> m_prev -> m_next = temp;
++m_counter;
inserted = true;
break;
}
else
{
data_checker = data_checker -> m_next;
}
}
if (inserted == false)//reached list end w/o insert, so ...
{
Node* temp = new Node(data, m_last, nullptr);
m_last -> m_next = temp;
m_last = temp;
++m_counter;
}
}
}
}
void DoublyList::display()const
{
if (!m_first)
{
std::cout << "List empty, nothing to display \n";
}
else
{
Node* q = m_first;
std::cout << "List with " << m_counter << " elements: \n";
while(q)
{
std::cout << q -> m_data << " <-> ";
q = q -> m_next;
}
std::cout << " NULL \n";
}
}
DoublyList::~DoublyList ()
{
Node* temp = m_first;
while (temp)
{
Node* m_next = temp -> m_next;
delete temp;
temp = m_next;
}
m_first = nullptr;
m_counter = 0;
}
|