c++模板单循环链表

#include "stdafx.h"
#include<iostream>
using namespace std;
/*1 应用模板 2使用class定义node,而不是struct */
//链表节点
template<class T>
class ListNode
{
public://引用public,避免了使用get,set所带来的麻烦
	T data;
	ListNode<T>*next;
public:
	ListNode(ListNode<T>*nextnode=0,const T&val=T())
	{
		data=val;
		next=nextnode;
	}
};
//链表的实现
template<class T>
class List
{
private:
	ListNode<T>*head,*tail;
	int size;
public:
	List();
	virtual~List();
	void Insert_Front(const T&e);//向表头插入节点
	void Insert_End(const T&e);//想表尾插入节点
	ListNode<T>*Find(const T&e);//查找指定节点
	bool Delete(const T&e);//删除指定节点
	List<T>&Delete_All();//删除除头结点的所有节点
	bool IsEmpty();//测试链表是否为空
	bool Size(){return size;}//返回节点数
	void OutPut();
};
//************************实现**********//
template<class T>
List<T>::~List()
{
	Delete_All();
	delete head;
}
template<class T>
List<T>::List()
{
	head=new ListNode<T>();
	tail=head;
	head->next=head;
}
template<class T>
void List<T>::Insert_Front(const T &e)
{
	ListNode<T>*NewNode=new ListNode<T>(0,e);
	if(head->next==head)//链表为空
	{
		head->next=NewNode;
		NewNode->next=head;
		tail=NewNode;
	}
	else
	{
		NewNode->next=head->next;
		head->next=NewNode;
	}
	++size;
}
template<class T>
void List<T>::Insert_End(const T&e)
{
	ListNode<T>*NewNode=new ListNode<T>(0,e);
	if(head->next==head)//链表为空
	{
		head->next=NewNode;
		NewNode->next=head;
		tail=NewNode;
	}
	else
	{
		tail->next=NewNode;
		NewNode->next=head;
		tail=NewNode;
	}
	++size;
}
template<class T>
ListNode<T>* List<T>::Find(const T&e)
{
	ListNode<T>*move=head->next;
	while(move->data!=e)
	{
		move=move->next;
		if(move==head)
			return NULL;
	}
	return move;
}
template<class T>
bool List<T>::Delete(const T &e)
{
	ListNode<T>*move=head->next;//删除节点
	ListNode<T>*pmove=head;//删除节点前一个节点
	while(move->data!=e)
	{
		move=move->next;
		pmove=pmove->next;
		if(move==head)
			return false;
	}
	pmove->next=move->next;
	if(move==tail)  //如果删除的是尾节点
		tail=pmove;
	delete move;
	return true;
}
template<class T>
void List<T>::OutPut()
{
	ListNode<T>*move=head->next;
	while(move!=head)
	{
		cout<<move->data<<""<<endl;
		move=move->next;
	}
	cout<<endl;

}
template<class T>
List<T>& List<T>::Delete_All()
{
	ListNode<T>*movenext,*move=head->next;
	while(move!=head)
	{
		movenext=move->next;
		delete move;
		move=movenext;
	}
	head=tail;
	head->next=head;
	return *this;
}
template<class T>
bool List<T>::IsEmpty()
{
	if(head->next=head)
		return true;
	else
		return false;
}
int main()
{
	List<int>* l=new List<int>();
	l->Insert_Front(1);
	l->Insert_Front(2);
	l->Insert_End(3);

	cout<<"查找节点的地址为"<<l->Find(1)<<endl;
	l->OutPut();

	cout<<"删除数据为2的节点"<<endl;
	l->Delete(2);
	l->OutPut();

	cout<<"删除所有节点"<<endl;
	l->Delete_All();
	l->OutPut();

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值