单向循环链表且带模板的实现 真正意义上c++实现 节点数据结构采用class形式,为了方便操作数据结构用public。 #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; }