#include <iostream>
#include <string>
#include <sstream>
using namespace std;
class IntList
{
struct ListItem
{
int item;
ListItem *next;
ListItem(int i, ListItem *n = NULL)
{
item = i;
next = n;
}
};
private:
int itemsCount;
ListItem *first;
ListItem *last;
public:
IntList()
{
itemsCount = 0;
first = last = NULL;
}
IntList(const IntList & src);
~IntList();
int Head() const
{
return first->item;
}
int & Head()
{
return first->item;
}
int Tail() const
{
return last->item;
}
int & Tail()
{
return last->item;
}
void AddLast(const IntList & src);
void AddFirst(int item);
void AddLast(int item);
int RemoveFirst();
bool Remove(int n);
void Insert(int n);
int getItemsCount()
{
return itemsCount;
}
string GetAllItemsInfo();
};
using namespace std;
IntList::IntList(const IntList & src)
{
itemsCount = 0;
first = last = NULL;
AddLast(src);
}
IntList::~IntList()
{
ListItem *current = NULL;
ListItem *next = first;
while (next)
{
current = next;
next = next->next;
delete current;
}
}
void IntList::AddLast(const IntList & src)
{
for (ListItem *cur = src.first; cur; cur = cur->next)
AddLast(cur->item);
}
void IntList::AddFirst(int item)
{
ListItem *newItem = new ListItem(item, first);
if (!first)
{
last = newItem;
}
first = newItem;
itemsCount++;
}
void IntList::AddLast(int item)
{
ListItem *newItem = new ListItem(item);
if (!last)
{
first = newItem;
}
else
{
last->next = newItem;
}
last = newItem;
itemsCount++;
}
int IntList::RemoveFirst()
{
int res = first->item;
first = first->next;
itemsCount--;
return res;
}
bool IntList::Remove(int value)
{
ListItem *prev = 0,
*current = first;
while(current)
{
if (current->item == value)
{
if (prev)
{
prev->next = current->next;
}
if (current == last)
{
last = prev;
}
delete current;
itemsCount--;
return true;
}
else
{
prev = current;
current = current->next;
}
}
return false;
}
void IntList::Insert(int value)
{
ListItem *prev = NULL,
*succ = first;
while ( succ !=NULL && succ->item < value)
{
prev = succ;
succ = succ->next;
}
ListItem *newItem = new ListItem(value, succ);
if ( succ == NULL)
{
last = newItem;
}
if (prev == NULL)
{
first = newItem;
}
else
{
prev->next = newItem;
}
itemsCount++;
}
string IntList::GetAllItemsInfo()
{
std::stringstream stream;
ListItem *current = first;
while (current)
{
stream << current->item << ' ';
current = current->next;
}
stream << endl;
return stream.str();
}
int main()
{
IntList list;
list.AddLast(2);
list.AddLast(3);
list.AddFirst(1);
cout << list.GetAllItemsInfo();
IntList list1(list);
list1.AddLast(4);
cout << list1.GetAllItemsInfo();
list1.Remove(2);
list1.Remove(5);
list1.Remove(4);
cout << list1.GetAllItemsInfo();
return 0;
}