#include<ostream>
#include<iostream>
#include<cstdlib>
using namespace std;
template<class T>
class Node
{
public:
T data;
Node<T> *next;
Node(T d = T(),Node<T> *n=NULL): data(d), next(n)
{}
};
template <class T>
class CirHSLinkedList
{
public:
Node<T> head;
CirHSLinkedList();
~CirHSLinkedList()
{
clear();
}
CirHSLinkedList(T const value[],int n);
bool isEmpty() const;
void clear();
CirHSLinkedList<T>& operator=(CirHSLinkedList<T> const &list);
CirHSLinkedList(CirHSLinkedList<T> const &list);
template <typename U>
friend ostream & operator << (ostream & out,CirHSLinkedList<U>const &list);
};
template<class T>
CirHSLinkedList<T>::CirHSLinkedList(T const value[],int n)
{
Node<T>*temp= &head;
for(int i=0;i<n;i++)
{
temp->next = new Node<T>(value[i]);
temp=temp->next;
}
}
template<class T>
CirHSLinkedList<T>::CirHSLinkedList()
{
}
template<class T>
bool CirHSLinkedList<T>::isEmpty() const
{
return 0 == head->next;
}
template<class T>
void CirHSLinkedList<T>::clear()
{
Node<T> *p = head.next;
while(p)
{
Node<T> *q=p;
p=p->next;
delete q;
}
head.next = NULL;
}
template<class T>
CirHSLinkedList<T>& CirHSLinkedList<T>:: operator=(CirHSLinkedList<T> const &list)
{
if(this == &list) return *this; //avoid self asignment
clear();
Node<T> *rear= &head;
for(Node<T> *p=list.head.next;p ;p = p->next)//change to NULL
{
rear->next=new Node<T>(p->data);
rear=rear->next;
}
return *this;
}
template<class T>
CirHSLinkedList<T>::CirHSLinkedList(CirHSLinkedList<T> const &list)
{
*this=list;
}
template<typename T>
ostream & operator << (ostream & ot,CirHSLinkedList<T> const &list)
{
Node<T> *p=list.head.next;
ot<<"(";
while(p!=NULL)
{
ot<<p->data;
p=p->next;
if(p!=NULL)
ot<<",";
}
ot<<")\n";
return ot;
}
int main()
{
CirHSLinkedList<char> lista("abc",3);
CirHSLinkedList<char> listb(lista);
cout << lista;
return 0;
}