用模板实现顺序表与单链表

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

以上是关于用模板实现顺序表与单链表的主要内容,如果未能解决你的问题,请参考以下文章

C数据结构单链表接口函数逻辑解析与代码实现(含详细代码注释)

数据结构----顺序表与单链表(JAVA)

线性表——顺序表与单链表学习小结

单链表与顺序表的对比

单链表与栈

数据结构--循环链表与双向链表