用顺序表调整la的左右两边,左边元素全部为奇数,右边元素全部为偶数

本文深入探讨了C++中模板类的实现细节,重点介绍了构造函数、析构函数、初始化和检查类是否为空的方法。通过实例展示了如何在类中使用这些函数进行内存管理,并提供了对类成员的遍历和获取长度的操作。最后,通过调整类的元素顺序来演示模板类的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//#include "SqList.h"
#include<iostream>
using namespace std;
const int Default=20;
enum StatusCode{SUCCESS,RANGE_ERROR,OVER_FLOW};
template<class ElemType>
class SqList
{
	protected:
		int count;
		int maxSize;
		ElemType *ptr;

		void Init(int size);
		bool Full()const;
	public:
		SqList(int size=Default);//注意构造函数不能声明为保护类型,否则在类外构造类时候,不能成功
		virtual ~SqList();//析构函数一定要定义为虚函数,否则有继承类时不能完全析构

		bool Empty()const;
		void Clear();
		void Traverse(void(* visit)(ElemType &e))const;
		int Length()const;

		StatusCode GetElem(int position,ElemType &e)const;
		StatusCode SetElem(int position,const ElemType &e);
		StatusCode Delete(int position,ElemType &e);
		StatusCode Insert(int position,const ElemType &e);

		SqList(const SqList<ElemType> &copy);
		SqList<ElemType> & operator = (const SqList<ElemType> &copy);
};

template<class ElemType>
int SqList<ElemType>::Length()const
{
	return count;
}
template<class ElemType>
void SqList<ElemType>::Init(int size)
{
	maxSize=size;
	if(ptr!=NULL)
		delete []ptr;
	else
		ptr=new ElemType[maxSize];
	count=0;
}

template<class ElemType>
SqList<ElemType>::SqList(int size)
{
	ptr=NULL;
	Init(size);
}

template<class ElemType>
SqList<ElemType>::~SqList()
{
	delete []ptr;
}


template<class ElemType>
void SqList<ElemType>::Clear()
{
	count=0;
}

template<class ElemType>
bool SqList<ElemType>::Empty()const
{
	return count==0;
}

template<class ElemType>
bool SqList<ElemType>::Full()const
{
	return count==maxSize;
}

template<class ElemType>
void SqList<ElemType>::Traverse(void(* visit)(ElemType &e))const
{
	for(int curPosition=0;curPosition<count;curPosition++)
		(* visit)(ptr[curPosition]);
}

template<class ElemType>
StatusCode SqList<ElemType>::SetElem(int position,const ElemType &e)
{
	if(position<1||position>count)
		return RANGE_ERROR;
	else
	{
		ptr[position-1]=e;
		return SUCCESS;
	}
}

template<class ElemType>
StatusCode SqList<ElemType>::GetElem(int position,ElemType &e)const
{
	if(position<1||position>count)
		return RANGE_ERROR;
	else
	{
		e=ptr[position-1];
		return SUCCESS;
	}
}

template<class ElemType>
StatusCode SqList<ElemType>::Delete(int position,ElemType &e)
{
	if(position<1||position>count)
		return RANGE_ERROR;
	else
	{
		e=ptr[position-1];
		for(int curPosition=position-1;curPosition<count;curPosition++)
			ptr[curPosition]=ptr[curPosition+1];
		--count;
		return SUCCESS;
	}
}

template<class ElemType>
StatusCode SqList<ElemType>::Insert(int position,const ElemType &e)
{
//	cout<<e<<" ";
	if(Full())
		return OVER_FLOW;
	else if(position+1<2||position>count+1)
		return RANGE_ERROR;
	else
	{
		count++;
		for(int curPosition=count;curPosition>=position;curPosition--)
			ptr[curPosition]=ptr[curPosition-1];
		ptr[curPosition]=e;
	//	cout<<curPosition<<" ";
	//	cout<<ptr[curPosition]<<" "<<endl;
		return SUCCESS;
	}
}

template<class ElemType>
SqList<ElemType>::SqList(const SqList<ElemType>& copy)
{
	init(copy.maxSize);
	count=copy.maxSize;
	for(int curPosition=0;curPosition<count;curPosition++)
		ptr[curPosition]=copy.ptr[curPosition];
}

template<class ElemType>
SqList<ElemType> &SqList<ElemType>::operator = (const SqList<ElemType> &copy)
{
	if(this!=&copy)//注意&copy
	{
			init(copy.maxSize);
			count=copy.maxSize;
			for(int curPosition=0;curPosition<count;curPosition++)
				ptr[curPosition]=copy.ptr[curPosition];
	}
	return *this;
}

template<class ElemType>
void Adjust(SqList<ElemType> &la)
{
	int aPosition=1;
	int bPosition=la.Length();
	ElemType aElem,bElem;
	while(aPosition<bPosition)
	{
		la.GetElem(aPosition,aElem);
		la.GetElem(bPosition,bElem);
		if(aElem%2==1)
			aPosition++;
		else if(bElem%2==0)
			bPosition--;
		else
		{
			la.SetElem(aPosition,bElem);
			la.SetElem(bPosition,aElem);
			aPosition++;
			bPosition--;
		}
	}
}

void main()
{
	SqList<int> la;
	int aElem;
	la.Insert(la.Length()+1,2);
	la.Insert(la.Length()+1,6);
	la.Insert(la.Length()+1,5);
	la.Insert(la.Length()+1,8);
	la.Insert(la.Length()+1,7);
	Adjust<int>(la);
	for(int curPosition=1;curPosition<=la.Length();curPosition++)
	{
		la.GetElem(curPosition,aElem);
		cout<<aElem<<" ";
	}
	cout<<endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值