//顺序表 #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; }
用模板实现顺序表与单链表
原创
©著作权归作者所有:来自51CTO博客作者sunshine225的原创作品,请联系作者获取转载授权,否则将追究法律责任
上一篇:空瓶换汽水的买汽水问题
下一篇:内存管理
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
简单的尾插法实现单链表
尾插法建立单链表
结点 头结点 链表 -
1.顺序表的实现——C语言
顺序表各种操作的代码实现
顺序表 冒泡排序 算法 随机数 -
顺序表、单链表、循环单链表、循环双链表、有序单链表的排序的实现
顺序表、单链表、循环单链表、循环双链表、有序单链表的排序的特点与算法实现
顺序表、单链表、循环单链表、循环双链表、 -
线性表——顺序表与单链表学习小结链表 顺序表 线性表 java