c++ 单链表模板类

/**
 *  
 *  File Name: LinkedList.hpp
 *  brief:单链表
 *  author:Patrick
 *  Create Time: 2019年01月16日 17:49:56
 *  
 */
#pragma once
#include <iostream>
#include <sstream>
using namespace std;

template<typename T>
class Node
{
	public:
		~Node()
		{}
		T data;
		Node<T>* next{nullptr};
};

template<typename DATA_TYPE = int32_t>
class LinkedList
{
	public:
		LinkedList();
		~LinkedList();
		/**
		 * \brief 销毁链表
		 */
		void destory();
		/**
		 * \brief 尾插
		 */
		void push_back(DATA_TYPE e);
		/**
		 * \brief 头插
		 */
		void push_front(DATA_TYPE e);
		/**
		 * \brief 头插
		 */
		void push_front(Node<DATA_TYPE>*);
		/**
		 * \brief 头删
		 */
		DATA_TYPE pop_front();
		/**
		 * \brief 尾删
		 */
		DATA_TYPE pop_back();
		/**
		 * \brief 删除当前结点后一个结点
		 */
		DATA_TYPE remove(Node<DATA_TYPE>* node);
		/**
		 * \brief 删除第一个值为e的结点
		 */
		void remove(DATA_TYPE e);
		/**
		 * \brief 逆置
		 */
		void reverse();
		/**
		 * \brief 查找
		 */
		Node<DATA_TYPE>* find(DATA_TYPE e);
		/**
		 * \brief 转成string
		 */
		std::string to_string(const DATA_TYPE& t);
		/**
		 * \brief 转成string
		 */
		std::string toString();
		
	private:
		Node<DATA_TYPE>* first;		//头结点
};

template<typename DATA_TYPE>
LinkedList<DATA_TYPE>::LinkedList()
{
	Node<DATA_TYPE>* p = new Node<DATA_TYPE>();
	if(p)
	{
		p->data = -1;
		p->next = nullptr;
		first = p;
	}
}
template<typename DATA_TYPE>
LinkedList<DATA_TYPE>::~LinkedList()
{
	while(first)
	{
		Node<DATA_TYPE>* p = first;
		first = first->next;
		delete(p);
		p = nullptr;
	}
}
template<typename DATA_TYPE>
void LinkedList<DATA_TYPE>::destory()
{
	Node<DATA_TYPE> *s = first->next;
	while(s)
	{
		Node<DATA_TYPE>* p = s;
		s = s->next;
		delete(p);
		p = nullptr;
	}
	first->next = nullptr;
}
template<typename DATA_TYPE>
void LinkedList<DATA_TYPE>::push_back(DATA_TYPE e)
{
	Node<DATA_TYPE>* cur = first;
	while(cur->next)
	{
		cur = cur->next;
	}
	Node<DATA_TYPE>* p = new Node<DATA_TYPE>();
	if(p)
	{
		p->data = e;
		cur->next = p;
	}
}
template<typename DATA_TYPE>
void LinkedList<DATA_TYPE>::push_front(Node<DATA_TYPE>* s)
{
	if(s)
	{
		s->next = first->next;
		first->next = s;
	}
}
template<typename DATA_TYPE>
void LinkedList<DATA_TYPE>::push_front(DATA_TYPE e)
{
	Node<DATA_TYPE>* p = new Node<DATA_TYPE>();
	if(p)
	{
		p->data = e;
		p->next = first->next;
		first->next = p;
	}
}
template<typename DATA_TYPE>
DATA_TYPE LinkedList<DATA_TYPE>::pop_front()
{
	Node<DATA_TYPE> * p = first->next;
	if(p)
	{
		DATA_TYPE e = p->data;
		first->next = p->next;
		delete(p);
		p = nullptr;
		return e;
	}
	return -1;
}
template<typename DATA_TYPE>
DATA_TYPE LinkedList<DATA_TYPE>::pop_back()
{
	Node<DATA_TYPE>* p = first;
	Node<DATA_TYPE>* s = p;
	while(p->next)
	{
		s = p;
		p = p->next;
	}
	DATA_TYPE e = p->data;
	s->next = nullptr;
	delete(p);
	p = nullptr;
	return e;
}
template<typename DATA_TYPE>
DATA_TYPE LinkedList<DATA_TYPE>::remove(Node<DATA_TYPE>* node)
{
	if(node->next)
	{
		Node<DATA_TYPE> *p = node->next;
		DATA_TYPE e = p->data;
		node->next = p->next;
		delete(p);
		p = nullptr;
		return e;
	}
	return -1;
}
template<typename DATA_TYPE>
void LinkedList<DATA_TYPE>::remove(DATA_TYPE e)
{
	Node<DATA_TYPE>* p = first;
	while(p->next)
	{
		if(p->next->data == e)
		{
			Node<DATA_TYPE> *s = p->next;
			p->next = s->next;		
			delete(s);
			s = nullptr;
		}
		else 
		{
			p = p->next;
		}
	}
}
template<typename DATA_TYPE>
void LinkedList<DATA_TYPE>::reverse()
{
	Node<DATA_TYPE>* p = first->next;
	Node<DATA_TYPE>* n = p->next;
	while(n)
	{
		p->next = n->next;
		push_front(n);
		n = p->next;
	}
}
template<typename DATA_TYPE>
Node<DATA_TYPE>* LinkedList<DATA_TYPE>::find(DATA_TYPE e)
{
	Node<DATA_TYPE> *p = first->next;
	while(p)
	{
		if( p->data != e)
		{
			p = p->next;
		}
		else {
			return p;
		}
	}
	return nullptr;
}

	template <typename DATA_TYPE>
std::string LinkedList<DATA_TYPE>::to_string(const DATA_TYPE& t)
{
	static std::ostringstream oss;
	oss.str("");
	oss << t;
	return oss.str();
}

template<typename DATA_TYPE>
std::string LinkedList<DATA_TYPE>::toString()
{
	std::string str = "";
	Node<DATA_TYPE> *p = first->next;
	while(p)
	{
		std::cout << p <<" "<< to_string(p->data) <<std::endl;
		str.append(to_string(p->data));
		p = p->next;
	}
	return str;
}
  
#include "../include/LinkedList.hpp"
using namespace std;

int main()
{
	LinkedList<char>* list = new LinkedList<char>();
	cout << "=====头插=====" << endl;
		list->push_front('A');
		list->push_front('B');
		list->push_front('C');
		list->push_front('D');
		list->push_front('E');
		list->push_front('F');
	list->toString();
	cout <<endl;

	cout << "=====销毁=====" << endl;
	list->destory();
	list->toString();
	cout <<endl;

	cout << "=====尾插=====" << endl;
		list->push_back('A');
		list->push_back('B');
		list->push_back('C');
		list->push_back('D');
		list->push_back('E');
		list->push_back('F');
	list->toString();
	cout <<endl;

	cout << "=====翻转=====" << endl;
	list->reverse();
	list->toString();
	cout <<endl;

	cout << "=====删除值为'C'的当前结点=====" << endl;
	list->remove('C');
	list->toString();
	cout <<endl;

	cout << "=====删除当前结点为'D'的下一个结点=====" << endl;
	list->remove(list->find('D'));
	list->toString();
	cout <<endl;

	cout << "=====删除尾结点=====" << endl;
	list->pop_back();
	list->toString();
	cout <<endl;

	cout << "=====删除首结点=====" << endl;
	list->pop_front();
	list->toString();
	cout <<endl;
	return 0;
}
 

结果:

=====头插=====
0x19970f0 F
0x19970d0 E
0x19970b0 D
0x1997090 C
0x1997070 B
0x1997050 A

=====销毁=====

=====尾插=====
0x1997050 A
0x1997070 B
0x1997090 C
0x19970b0 D
0x19970d0 E
0x19970f0 F

=====翻转=====
0x19970f0 F
0x19970d0 E
0x19970b0 D
0x1997090 C
0x1997070 B
0x1997050 A

=====删除值为'C'的当前结点=====
0x19970f0 F
0x19970d0 E
0x19970b0 D
0x1997070 B
0x1997050 A

=====删除当前结点为'D'的下一个结点=====
0x19970f0 F
0x19970d0 E
0x19970b0 D
0x1997050 A

=====删除尾结点=====
0x19970f0 F
0x19970d0 E
0x19970b0 D

=====删除首结点=====
0x19970d0 E
0x19970b0 D
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值