#include "iostream.h"
template<class type=int>
struct QueueItem
{
QueueItem(const type &item)
{
value=item;
next=NULL;
}
type value;
QueueItem *next;
};
template<class type=int>
class Queue
{
public:
Queue():front(0),back(0){size=0;}
~Queue();
void AddItem(const type &item);
type RemoveItem();
int GetSize(){return size;}
bool IsEmpty();
type RemoveBack();
type RemoveFront();
protected:
private:
QueueItem<type> *front;
QueueItem<type> *back;
int size;
};
template<class type> void Queue<type>::AddItem(const type &item)
{
QueueItem<type> *pt;
if (!front)
{
front=back=new QueueItem<type>(item);
size++;
}else
{
pt=new QueueItem<type>(item);
back->next=pt;
back=pt;
size++;
}
}
template<class type> type Queue<type>::RemoveItem()
{
type val;
QueueItem<type> *pt;
if (front)
{
val=front->value;
pt=front;
front=front->next;
size--;
delete pt;
return val;
}else
{
size=0;
return NULL;
}
}
template<class type> bool Queue<type>::IsEmpty()
{
return front==NULL;
}
template<class type> type Queue<type>::RemoveBack()
{
QueueItem<type> * pt;
type val;
pt=head;
if (front==back)
{
val=front->value;
delete front;
front=back=NULL;
return val;
}
while(pt&&pt->next!=tail)
{
pt=pt->next;
}
val=back->value;
delete back;
back=pt;
back->next=NULL;
return val;
}
template<class type> type Queue<type>::RemoveFront()
{
type val;
size++;
QueueItem<type> *pt;
if (front)
{
val=front->value;
pt=front;
front=front->next;
delete pt;
return val;
}else
{
size=0;
return NULL;
}
}
template<class type> Queue<type>::~Queue()
{
QueueItem<type> *p;
while (front)
{
p=front;
front=front->next;
delete p;
}
}
template<class type=int>
struct ListItem
{
ListItem(const type &item)
{
value=item;
next=NULL;
}
type value;
ListItem *next;
};
template<class type=int>
class List
{
public:
List():head(0),tail(0){size=0;}
~List();
void AddFrontItem(const type &item);
void AddTailItem(const type &item);
// type RemoveItem();
int GetSize(){return size;}
bool IsEmpty();
type RemoveHead();
type RemoveTail();
protected:
private:
ListItem<type> *head;
ListItem<type> *tail;
int size;
};
template<class type> List<type>::~List()
{
ListItem<type> *p;
while (head)
{
p=head;
head=head->next;
delete p;
}
}
template<class type> void List<type>::AddFrontItem(const type &item)
{
ListItem<type> *pt;
if (!head)
{
head=tail=new ListItem<type>(item);
size++;
}else
{
pt=new ListItem<type>(item);
pt->next=head;
head=pt;
size++;
}
}
template<class type> void List<type>::AddTailItem(const type &item)
{
ListItem<type> *pt;
if (!head)
{
head=tail=new ListItem<type>(item);
size++;
}else
{
pt=new ListItem<type>(item);
tail->next=pt;
tail=pt;
size++;
}
}
template<class type> type List<type>::RemoveHead()
{
ListItem<type>* pt;
type val;
if (head)
{
pt=head;
val=head->value;
head=head->next;
delete pt;
size--;
return val;
}
else
{
size=0;
return NULL;
}
}
template<class type> type List<type>::RemoveTail()
{
ListItem<type>* pt;
type val;
pt=head;
if (head==tail)
{
val=head->value;
delete head;
head=tail=NULL;
return val;
}
while(pt&&pt->next!=tail)
{
pt=pt->next;
}
val=tail->value;
delete tail;
tail=pt;
tail->next=NULL;
return val;
}
int main()
{
Queue<> Queue1;
List<> Mylist;
for (int i =0;i<10;i++)
{
Queue1.AddItem(i);
Mylist.AddFrontItem(i);
Mylist.AddTailItem(i);
}
for ( i =0;i<20;i++)
{
cout<<Mylist.RemoveHead()<<" ";
}
return 0;
}