#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;
}
c++模板单循环链表
最新推荐文章于 2024-08-03 14:56:14 发布