用C++实现数据结构二 带头结点的单链表
2013-04-10 16:21
766 查看
ListNode.h
SingleList.h
template<typename Type> class SingleList; template<typename Type> class ListNode { private: friend typename SingleList<Type>; //建立一对一的映射,只将与ListNode类用同样类型实例化的SingleList类设为友元 ListNode():next(NULL) {} //初始化结点的数据,next指针默认指向空 ListNode(const Type item, ListNode<Type> *nex= NULL):data(item), next(nex) {} ~ListNode() { next = NULL; } public: friend ostream& operator<< <Type>( ostream&, ListNode<Type>& ); Type GetData(); private: Type data; ListNode *next; }; template<typename Type> Type ListNode<Type>::GetData() { return this->data; } template<typename Type> ostream& operator<< (ostream &os, ListNode<Type> &l) { os<<l.data; return os; }
SingleList.h
#include "ListNode1.h" template<typename Type> class SingleList { private: ListNode<Type> *head; public: SingleList(): head( new ListNode<Type>() ){} ~SingleList() { MakeEmpty(); delete head; } void MakeEmpty(); int Length(); ListNode<Type> *Find(int n); bool Insert( Type item, int n); Type Remove( int n=0); bool RemoveAll(Type item); Type Get( int n); void Print(); }; template<typename Type> void SingleList<Type>::MakeEmpty() { ListNode<Type> *pmov = head->next, *pdel; while(pmov != NULL) { pdel = pmov; pmov = pmov->next; delete pdel; } head->next = NULL; } template<typename Type> int SingleList<Type>::Length() { int count=0; ListNode<Type> *pmov = head->next; while(pmov != NULL) { count++; pmov = pmov->next; } return count; } template<typename Type> ListNode<Type>* SingleList<Type>::Find(int n) { if(n < 1) { cout<<"the input is illegal"<<endl; return NULL; } int i = 0; ListNode<Type> *pmov = head; while(i<n && pmov != NULL) { i++; pmov= pmov->next; } if( pmov == NULL) { cout<<"cannot find the node at "<<n<<endl; return NULL; } return pmov; } template<typename Type> bool SingleList<Type>::Insert(Type item, int n) { if(n ==0 ) { ListNode<Type> *pin = new ListNode<Type>(item); pin->next = head->next; head->next = pin; return true; } ListNode<Type> *p = Find(n); if( p == NULL) { cout<<"cannot insert the data "<<item<<" at "<<n<<endl; return false; } ListNode<Type> *pin = new ListNode<Type>(item); pin->next = p->next; p->next = pin; return true; } template<typename Type> Type SingleList<Type>::Remove(int n=0) { if(n<1) { cout<<"the n is illegal"<<endl; return 0; } ListNode<Type> *pdel = Find(n); if(pdel == NULL) { cout<<"can not remove the node at "<<n<<endl; return 0; } //是第一个节点 if(head->next == pdel) { head->next = pdel->next; int item = pdel->data; delete pdel; return item; } //其他节点 ListNode<Type> *p = Find(n-1); p->next = pdel->next; int item = pdel->data; delete pdel; return item; } template<typename Type> bool SingleList<Type>::RemoveAll(Type item) { int count=0; ListNode<Type> *pmov = head->next, *pdel; ListNode<Type> *p =head; while(pmov != NULL) { p->next = pmov; pdel = pmov; if(pmov->data == item) { count++; p->next = pmov->next; pmov = pmov->next; delete pdel; } else { pmov = pmov->next; p=p->next ; } } if(count != 0) return true; else return false; } template<typename Type> Type SingleList<Type>::Get(int n) { if(n<1) { cout<<"can not get the data at "<<n<<endl; return 0; } ListNode<Type> *p = Find(n); if(p == NULL) { cout<<"can not get the data at "<<n<<endl; return 0; } return p->data; } template<typename Type> void SingleList<Type>::Print() { cout<<"head-->"; ListNode<Type> *p = head->next ; while(p != NULL) { cout<<p->data<<"-->"; p= p->next; } cout<<"over"<<endl; }
相关文章推荐
- 数据结构 带头结点的单链表 操作大全 最全的链表操作(c++实现)
- 经典算法与数据结构的c++实现——带头结点的单链表
- C++模板实现双向循环链表(有带头结点)
- 数据结构(四)——单链表 、带头结点的单链表、循环链表 及其实现
- 数据结构(二)——单链表 、带头结点的单链表、循环链表 及其实现
- 带头结点单链表的各种各种运算(C++模板类实现)
- 带头结点的链表尾插法C++实现
- 【c++版数据结构】之用带头节点的单链表实现一元多项式(C语言版)
- 【c++版数据结构】之循环单链表的实现(带头结点以及尾节点)
- 【C++数据结构学习笔记---线性表】带头结点的双向循环链表
- 【c++版数据结构】之循环单链表的实现(带头结点以及尾节点)
- 数据结构(5)线性表之链表C++实现带头结点的单链表合并
- 【c++版数据结构】之循环双链表的实现(带头结点以及尾节点)
- 【c++版数据结构】之单链表的实现(带头结点以及尾节点)
- 数据结构-java与c实现带头结点的单链表
- 数据结构(四)——单链表 、带头结点的单链表、循环链表 及其实现
- 【c++版数据结构】之双链表的实现(带头结点以及尾节点)
- 不带头结点的链表头插法C++实现
- C++实现带头结点单链表
- 数据结构 P38 算法实现 在带头结点的单链表的第i个元素插入元素e