#include <conio.h>
#include <iostream.h>
#include <stdlib.h>
#define N 2
template <class DataT> class listob;
template <class DataT> class listob
{public:
DataT info;
listob<DataT> *next;
listob()
{info=0; next=NULL;}
listob(DataT c)
{info=(int)c%N; next=NULL;}
void getinfo(DataT &c){c=info;}
void operator<<(DataT b)
{info=(int)b%N; }};
template <class DataT>
class dlist: public listob<DataT>
{listob<DataT> *start;
public:
dlist(){start=NULL;}
~dlist();
void tostart(DataT);
void toend(DataT);
void delstart(void);
void delend(void);
void show();
listob<DataT> *getstart(){return start;} };
template <class DataT> dlist<DataT>::~dlist()
{ listob<DataT> *p, *p1;
p=start;
while(p!=start)
{ p1=p->next;
delete p;
p=p1;}}
template <class DataT> void dlist<DataT>::tostart(DataT c)
{listob<DataT> *p;
p= new listob<DataT>;
*p<<c;
if(start==NULL)
{ start=p;
start->next=start; }
else
{p->next=start->next;
start->next=p;}}
template <class DataT> void dlist<DataT>::toend(DataT c)
{ tostart(c);
start=start->next;}
template <class DataT> void dlist<DataT>::delstart(void)
{if(start==0||start==start->next){start=0;return;}
listob<DataT> *p;
p=start->next;
start->next=(start->next)->next;
delete p;}
template <class DataT> void dlist<DataT>::delend(void)
{if(start==0||start==start->next){start=0;return;}
listob<DataT>* p= new listob<DataT>;
p=start;
while(p->next!=start)
p=p->next;
start=p;
delstart();}
template <class DataT>
void dlist<DataT>::show(void)
{if(start==NULL){cout<<"Список пуст";return;}
listob<DataT> *t=start;
do{t=t->next;cout<<t->info<<" ";}while(t!=start);}
void main (void)
{clrscr();
dlist<int> list;
list.tostart(1);
list.tostart(2);
list.tostart(3);
list.tostart(5);
list.tostart(6);
cout<<"Исходный список\n";
list.show();
cout << "\nУдаление с начала\n";
list.delstart();
list.show();
cout << "\nДобавление в конец 4\n";
list.toend(4);
list.show();
cout<<"\nУдаление с конца\n";
list.delend();
list.show();
getch();}