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
面向对象程序设计课程作业 1. 请创建一个数据类型为T的链表类模板List,实现以下成员函数: 1) 默认构造函数List(),将该链表初始化为一个空链表(10分) 2) 拷贝构造函数List(const List& list),根据一个给定的链表构造当前链表(10分) 3) 析构函数~List(),释放链表中的所有节点(10分) 4) Push_back(T e)函数,往链表最末尾插入一个元素为e的节点(10分) 5) operator<<()友元函数,将链表的所有元素按顺序输出(10分) 6) operator=()函数,实现两个链表的赋值操作(10分) 7) operator+()函数,实现两个链表的连接,A=B+C(10分) 2. 请编写main函数,测试该类模板的正确性: 1) 用List模板定义一个List类型的模板类对象int_listB,从键盘读入m个整数,调用Push_back函数将这m个整数依次插入到该链表中;(4分) 2) 用List模板定义一个List类型的模板类对象int_listC,从键盘读入n个整数,调用Push_back函数将这n个整数依次插入到该链表中;(4分) 3) 用List模板定义一个List类型的模板类对象int_listA,调用List的成员函数实现A = B + C;(4分) 4) 用cout直接输出int_listA的所有元素(3分) 5) 用List模板定义List类型的模板类对象double_listA, double_listB, double_listC,重复上述操作。(15分) 3. 输入输出样例: 1) 输入样例 4 12 23 34 45 3 56 67 78 3 1.2 2.3 3.4 4 4.5 5.6 6.7 7.8 2) 输出样例 12 23 34 45 56 67 78 1.2 2.3 3.4 4.5 5.6 6.7 7.8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值