用模板实现顺序表与单链表
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用模板实现顺序表与单链表相关的知识,希望对你有一定的参考价值。
//顺序表 #include<iostream> using namespace std; template<typename T> class SeqList { public: SeqList(); ~SeqList(); SeqList(const SeqList& s); SeqList& operator=(const SeqList &s); void _CheakCapacity(); void PushBack(const T& x); void PopBack(); void Print(); private: size_t _capacity; T* _data; size_t _size; }; template<typename T> SeqList<T>::SeqList() :_capacity(3) ,_data(new T[_capacity]) ,_size(0) {} template<typename T> SeqList<T>::~SeqList() { delete[]_data; } template<typename T> SeqList<T>::SeqList(const SeqList& s)//浅拷贝的问题-析构两次 :_capacity(s._capacity) ,_data(s._data) ,_size(s._size) {} template<typename T> SeqList<T>& SeqList<T>::operator=(const SeqList &s)//深拷贝 { if(this!=&s) { _capacity=s._capacity; _size=s._size; delete _data; _data=new T[_capacity]; memcpy(_data,s._data,_size); } return *this; } template<typename T> void SeqList<T>::_CheakCapacity() { if(_size>=_capacity) { _capacity=_capacity*2+3; T* tmp=new T[_capacity]; memcpy(tmp,_data,sizeof(T)* _size); free(_data); _data=tmp; } } template<typename T> void SeqList<T>::PushBack(const T &x) { _CheakCapacity(); _data[_size++]=x; } template<typename T> void SeqList<T>::PopBack() { if(_size!=0) { _size--; } } template<typename T> void SeqList<T>::Print() { size_t i; for(i=0;i<_size;i++) { printf("%d ",_data[i]); } printf("\n"); } void Test1() { SeqList<char> sl1; SeqList<char> sl2; sl1.PushBack(1); sl1.PushBack(2); sl1.PushBack(3); sl1.Print(); //SeqList<char> sl2(sl1); sl2=sl1;//涉及深浅拷贝 sl2.Print(); } void Test2() { SeqList<char> sl1;//记得多测几个类型 sl1.PushBack(1); sl1.PushBack(2); sl1.PushBack(3); sl1.PushBack(4); sl1.PopBack(); sl1.PopBack(); sl1.PopBack(); sl1.PopBack(); sl1.Print(); } int main() { Test1(); //Test2(); system("pause"); return 0; } //单链表 #include<iostream> using namespace std; template<typename T> struct ListNode { T _data; ListNode* _next; ListNode(const T &x) :_data(x) ,_next(NULL) {} }; template<typename T> class List { public: List(); ~List(); List(const List& l);// List<T>& operator=(const List& l); void _Clear(); void PushBack(const T& x); void PopBack(); void Print(); private: ListNode<T>* _head; ListNode<T>* _tail; }; template<typename T> List<T>::List() :_head(NULL) ,_tail(NULL) {} template<typename T> List<T>::~List() { _Clear(); } template<typename T> void List<T>::_Clear() { ListNode<T>* cur=_head; while(cur) { ListNode<T>* del=cur; cur=cur->_next; delete del; } _head=NULL;//易忘 _tail=NULL; } template<typename T>//有问题 List<T>& List<T>::operator=(const List& l) { if(this!=&l) { ListNode<T>*l._head=new ListNode<T>* head; l._head->_data=_data; l._head->_next=_next; } return *this; } template<typename T> void List<T>::PushBack(const T& x) { if(_head==NULL) { _head=new ListNode<T>(x); _tail=_head; } else { _tail->_next=new ListNode<T>(x); _tail=_tail->_next; } } template<typename T> void List<T>::PopBack() { if(_head==_tail) { delete _head; _head=NULL;//易忘 _tail=NULL; } else { ListNode<T>* cur=_head; while(cur->_next!=_tail) { cur=cur->_next; } cur->_next=NULL; delete _tail; _tail=cur; } } template<typename T> void List<T>::Print() { ListNode<T>*cur=_head; while(cur) { cout<<cur->_data<<"->"; cur=cur->_next; } cout<<"Tail"<<endl; } void Test1() { List<int> l1; List<int> l2=l1; l1.PushBack(1); l1.PushBack(2); l1.PushBack(3); l1.Print(); l2.Print(); } void Test2() { List<int> l; l.PushBack(1); l.PushBack(2); l.PushBack(3); l.Print(); l.PopBack(); l.PopBack(); l.PopBack(); l.Print(); } int main() { Test1(); //Test2(); system("pause"); return 0; }
本文出自 “sunshine225” 博客,请务必保留此出处http://10707460.blog.51cto.com/10697460/1757301
以上是关于用模板实现顺序表与单链表的主要内容,如果未能解决你的问题,请参考以下文章