C++单向循环链表

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;
};


你可能感兴趣的:(C++,链表,c++,数据结构)