C++单向循环链表
#pragma once
#include
using namespace std;
template<class T>
class SingleCircularLinkList;
template<class T>
class Node
{
public:
Node(T data)
{
this->data = data;
next = nullptr;
}
friend ostream& operator<<(ostream& os,Node<T>* node)
{
return os<< node->data;
}
friend class SingleCircularLinkList<T>;
private:
Node<T> *next;
T data;
};
template<class T>
class SingleCircularLinkList
{
public:
SingleCircularLinkList()
{
first = last = new Node<T>(100);
last->next = first;
size = 0;
}
bool isEmpty()
{
if (size == 0)
return true;
return false;
}
void clear()
{
if (isEmpty())
return;
auto p = first->next;
Node<T>* s = nullptr;
while (p!=last)
{
s = p;
delete s;
p = p->next;
}
delete p;
}
void show_list()
{
if (isEmpty())
return;
auto p = first->next;
while (p!=last)
{
cout << p<<endl;
p = p->next;
}
cout << p << endl;
}
T find(int index)
{
if (isEmpty())
return -1;
if (index<0 || index>size)
return -1;
auto p = first->next;
for (int i=0;i<size;++i)
{
if(i == index)
break;
p = p->next;
}
return p->data;
}
int find_data(T data)
{
if (isEmpty())
return -1;
int index = 0;
auto p = first->next;
while (p!=last)
{
if(p->data == data)
break;
++index;
p = p->next;
}
return index;
}
Node<T>* find_node(int index)
{
if (isEmpty())
return nullptr;
if (index<1 || index>size)
return nullptr;
auto p = first->next;
for (int i = 0; i < size; ++i)
{
if (i == index)
break;
p = p->next;
}
return p;
}
void insert_index(T data, int index)
{
if (index <0 || index > size)
return;
auto node = new Node<T>(data);
if (index == 0)
{
node->next = first->next;
first->next = node;
if (size == 0)
{
last = node;
last->next = first;
}
}
else if(index == size)
{
last->next = node;
last = node;
last->next = first;
}
else
{
auto p = find_node(index);
node->next = p->next;
p->next = node;
}
++size;
}
T pop_index(int index)
{
if (size == 0)
return -1;
if (index <0 || index > size)
return -1;
T data;
Node<T>* node = nullptr;
if (index == 0)
{
node = first->next;
first->next = node->next;
}
else if (index == size-1)
{
auto p = find_node(index-1);
node = p->next;
p->next = first;
last = p;
}
else
{
auto p = find_node(index-1);
node = p->next;
p->next = node->next;
}
--size;
data = node->data;
delete node;
return data;
}
void push_back(T data)
{
insert_index(data, size);
}
void push_front(T data)
{
insert_index(data, 0);
}
T pop_back()
{
return pop_index(size-1);
}
T pop_front()
{
return pop_index(0);
}
private:
Node<T> *first;
Node<T> *last;
int size;
};