#include <iostream>
using namespace std;
template<
class Type>
struct Node
{
Type data;
Node<Type> *next;
};
template<
class Type>
class Circlist
{
protected:
int len;
Node<Type>* Head;
public:
Circlist();
Circlist(
const Circlist<Type>& otherList);
~Circlist();
void createListForward();
void createBackward();
void initList();
bool isEmptyList();
void printList();
int length();
void destoryList();
void getFirstData(Type& firstItem);
void search(
const Type searchItem);
void insertFirst(
const Type newItem);
void insertLast(
const Type newItem);
void insertBefore(
const int pos,
const Type newItem);
void insertAfter(
const int pos,
const Type newItem);
void deleteNode(
const Type deleteItem);
void deleteNode(
const int pos,Type& deleteItem);
void reverse();
const Circlist<Type>&
operator=(
const Circlist<Type>&otherList);
};
template<
class Type>
Circlist<Type>::Circlist()
{
Head =
new Node<Type>;
Head->next = Head;
len =
0;
}
template<
class Type>
Circlist<Type>::Circlist(
const Circlist<Type>&otherList)
{
Head =
new Node<Type>;
Head->next = Head;
len =
0;
Node<Type>* current = Head;
Node<Type>* otherListCurrent = otherList.Head->next;
if (otherList.Head->next != otherList.Head)
{
while(otherListCurrent->next!=otherList.Head)
{
Node<Type>* newNode =
new Node<Type>;
newNode->data = otherListCurrent->data;
newNode->next = current->next;
current->next = newNode;
current=current->next;
otherListCurrent = otherListCurrent->next;
len++;
}
if (otherListCurrent->next==otherList.Head)
{
Node<Type>* newNode =
new Node<Type>;
newNode->data = otherListCurrent->data;
newNode->next = current->next;
current->next = newNode;
len++;
}
}
}
template<
class Type>
const Circlist<Type>& Circlist<Type>::
operator=(
const Circlist<Type>&otherList)
{
Node<Type>* current = Head;
Node<Type>* otherListCurrent=otherList.Head->next;
if (
this!=&otherList)
{
if (current->next!=Head)
{
initList();
}
while(otherListCurrent!=otherList.Head)
{
Node<Type>* newNode =
new Node<Type>;
newNode->data = otherListCurrent->data;
newNode->next = current->next;
current->next = newNode;
current=current->next;
otherListCurrent = otherListCurrent->next;
len++;
}
}
return *
this;
}
template<
class Type>
Circlist<Type>::~Circlist()
{
destoryList();
}
template<
class Type>
void Circlist<Type>::createListForward()
{
Node<Type>* newNode;
cout<<
"输入链表长度:"<<endl;
cin>>len;
for (
int i=
0;i<len;i++)
{
newNode =
new Node<Type>;
cout<<
"输入元素:"<<endl;
cin>>newNode->data;
newNode->next=Head->next;
Head->next = newNode;
}
}
template<
class Type>
void Circlist<Type>::createBackward()
{
Node<Type>* current = Head;
Node<Type>* newNode;
cout<<
"输入链表长度:"<<endl;
cin>>len;
for (
int i=
0;i<len;i++)
{
newNode =
new Node<Type>;
cout<<
"输入元素:"<<endl;
cin>>newNode->data;
newNode->next = current->next;
current->next = newNode;
current=current->next;
}
}
template<
class Type>
void Circlist<Type>::initList()
{
destoryList();
Head =
new Node<Type>;
Head->next = Head;
len =
0;
}
template<
class Type>
bool Circlist<Type>::isEmptyList()
{
if (Head->next==Head)
{
return true;
}
else
{
return false;
}
}
template<
class Type>
void Circlist<Type>::printList()
{
Node<Type>*current=Head->next;
while (current!=Head)
{
cout<<current->data<<endl;
current=current->next;
}
}
template<
class Type>
int Circlist<Type>::length()
{
return len;
}
template<
class Type>
void Circlist<Type>::destoryList()
{
Node<Type>* current;
Node<Type>* temp;
if (Head!=NULL)
{
temp = Head;
current = Head->next;
while(current!=Head)
{
delete temp;
temp = current;
current = current->next;
}
delete temp;
len=
0;
}
}
template<
class Type>
void Circlist<Type>::getFirstData(Type& firstItem)
{
if (!isEmptyList())
{
firstItem = (Head->next)->data;
}
else
{
cout<<
"链表为空!"<<endl;
}
}
template<
class Type>
void Circlist<Type>::search(Type searchItem)
{
Node<Type>* current;
if (isEmptyList())
{
cout<<
"List is Empty"<<endl;
}
else
{
current = Head->next;
while (current!=Head && current->data!=searchItem)
{
current = current->next;
}
if (current!=Head)
{
cout<<searchItem<<
"is Found in the list"<<endl;
}
else
{
cout<<searchItem<<
"Item is not Found in the list"<<endl;
}
}
}
template<
class Type>
void Circlist<Type>::insertFirst(
const Type newItem)
{
Node<Type> *newNode =
new Node<Type>;
newNode->data = newItem;
newNode->next = Head->next;
Head->next = newNode;
len++;
}
template<
class Type>
void Circlist<Type>::insertLast(
const Type newItem)
{
Node<Type> *newNode =
new Node<Type>;
newNode->data = newItem;
Node<Type>* current = Head;
while (current->next != Head)
{
current = current ->next;
}
newNode->next = current->next;
current->next = newNode;
len++;
}
template<
class Type>
void Circlist<Type>::insertBefore(
const int pos,
const Type newItem)
{
int i=
1;
Node<Type>* current = Head->next;
if (pos<
1 || pos>len)
{
cout<<
"插入位置不正确!"<<endl;
return;
}
Node<Type>* newNode =
new Node<Type>;
newNode->data = newItem;
if (
1==pos)
{
newNode->next = Head->next;
Head->next = newNode;
}
else
{
while(i<pos-
1)
{
current = current->next;
i++;
}
newNode->next = current->next;
current->next = newNode;
}
len++;
}
template<
class Type>
void Circlist<Type>::insertAfter(
const int pos,
const Type newItem)
{
int i=
1;
Node<Type>* current = Head->next;
if (pos<
1 || pos>len)
{
cout<<
"插入位置不正确!"<<endl;
return;
}
Node<Type>* newNode =
new Node<Type>;
newNode->data = newItem;
while(i<pos)
{
current = current->next;
i++;
}
newNode->next = current->next;
current->next = newNode;
len++;
}
template<
class Type>
void Circlist<Type>::deleteNode(
const Type deleteItem)
{
Node<Type>* current=Head -> next;
Node<Type>* trailCurrent = Head;
if (isEmptyList())
{
cout<<
"List is Empty"<<endl;
}
else
{
while (current!=Head && current->data!=deleteItem)
{
trailCurrent = current;
current=current->next;
}
if (current==NULL)
{
cout<<
"Item is not Found in the list"<<endl;
}
else
{
trailCurrent->next = current->next;
delete current;
cout<<
"Item is delete in the list"<<endl;
}
len--;
}
}
template<
class Type>
void Circlist<Type>::deleteNode(
const int pos,Type& deleteItem)
{
int i=
1;
Node<Type>* current = Head;
Node<Type>* temp;
if (pos<
1 || pos>len)
{
cout<<
"删除位置不正确!"<<endl;
deleteItem = -
1;
return;
}
while(i<pos)
{
current = current->next;
i++;
}
temp = current->next;
current->next = temp->next;
deleteItem = temp->data;
delete temp;
len--;
}
template<
class Type>
void Circlist<Type>::reverse()
{
Node<Type>* current = Head->next;
Head->next=Head;
if (current==Head)
{
cout<<
"链表为空!"<<endl;
}
else
{
while (current!=Head)
{
Node<Type>* nextCurrent = current->next;
current->next = Head->next;
Head->next=current;
current = nextCurrent;
}
}
}
int main()
{
Circlist<
int> list1;
list1.createBackward();
list1.reverse();
list1.printList();
system(
"pause");
return 0;
}