顺序表的C++实现

#include<iostream>
using namespace std;

#define INC_SIZE 10 

template<typename _Ty>
class seqlist
{
public:
	seqlist(int sz=Defaultsize):size(0)
	{
		capacity = sz;
		elem = new _Ty[capacity];
	}
	~seqlist()
	{
		delete []elem;
	}
public:
	bool inc()
	{
		capacity += INC_SIZE;
		elem = (_Ty *)realloc(elem,sizeof(_Ty)*capacity);
		//realloc 返回一个void*指针,需要重新
		//定义一个指针,判断申请前后内存地址是否发生变化
		if(elem == NULL)
		{
			capacity -= INC_SIZE;
			return false;
		}
		return true;
	}
/*	void Inc()
	{
		capacity += INC_SIZE;
		_Ty* myelem;	
		myelem = new _Ty[capacity];
		for(int i=0; i<size; ++i)
		{
			myelem[i] = elem[i];
		}
		delete []elem;
		elem = myelem;
	}
*/
  bool full()const
	{
		return size >= capacity;
	}
	bool empty()const
	{
		return size == 0;
	}
	void insert(const _Ty& x, int index) 
	{
		if(index < 0 || index==size-1)
			return;
		if(full())
		{
			inc();
		}		
		for(int i=size; i>index; --i)
		{
			elem[i] = elem[i-1];
		}
		elem[index] = x;
		size++;	
	}
	void push_back(const _Ty &x)
	{
		if(full())
			inc();
		elem[size++] = x;
	}
	void push_front(const _Ty &x)
	{
		if(full())
			inc();
		for(int i=size; i>0; --i)
			elem[i] = elem[i-1];
		elem[0] = x;
		size++;
	}
	void pop_back()
	{
		size--;
	}
	void pop_front()
	{
		remove(0);
	}
	void remove(int pos)//pos从0开始
	{
		if(pos<0 || pos>size-1)
			return;
		for(int i=pos; i<size; ++i)
			elem[i] = elem[i+1];
		size--;
	}
	int find(const _Ty x)const
	{
		for(int i=0; i<size; ++i)
		{
			if(elem[i] == x)
			{
				//cout<<" i ="<<i<<endl;
				return i;
			}			
		}
	//	cout<<"Not find~~!"<<endl;
		return -1;
	
	}
	bool iselem(const _Ty x)const//判断元素是否在此表中
	{
		if(find(x) == -1)
		{
			cout<<"x 不在seqlist中"<<endl;
			return false;
		}
		cout<<"x在此seqlist中。"<<endl;
		return true;
	
	}
	_Ty next(const _Ty &x)const
	{
		int i=find(x);	
//		i++;
		if(i >= size-1)//最后一个元素的后继返回他自己
			return elem[i];
		cout<<elem[++i]<<endl;
		return elem[i];
	}
	_Ty prior(const _Ty &x)const
	{
		int i=find(x);
		if(i <= 0) //第一个元素的后继默认为他自己
			return elem[i];
		cout<<elem[--i]<<endl;
		return elem[i];
	}
	void show()const
	{
		for(int i=0; i<size; ++i)
			cout<<elem[i]<<" ";
		cout<<endl;
	}
	_Ty getelem(const int pos)const
	{
		if(pos<0 || pos>size-1)
			return false;
		cout<<elem[pos]<<endl;
		return elem[pos];	
	}
	int getsize()const
	{
		cout<<"length="<<size<<endl;
		return size;
	}
	void swap(_Ty &x,_Ty &y)
	{
		_Ty z;
		z = x;
		x = y;
		y = z;
	}
	void sort()
	{	
		for(int i=0; i<size; ++i)
		{
			int j = i+1;
			for(; j<size; ++j)
			{
				if(elem[i] < elem[j])
					swap(elem[i],elem[j]);
			}
		}		
	}
	void clear()
	{
		size = 0;	
	}
private:
	enum{Defaultsize = 10};
	size_t capacity;
	size_t size;
	_Ty *elem;
};

//seqlist存储数据从0位置开始
void main()
{
	seqlist<int> slt;
	for(int i=0; i<9; ++i)
		slt.insert(i+1,i);
	slt.show();
	slt.getsize();
	slt.insert(10,9);
	slt.insert(11,2);
	slt.show();
/*
	slt.remove(3);
	slt.show();
	slt.find(9);
	slt.iselem(4);
	slt.next(6);
	slt.prior(6);
	slt.getelem(4);
	slt.length();
	slt.push_back(19);
	slt.push_front(23);
	slt.show();
	slt.pop_back();
	slt.pop_front();
	slt.show();
	slt.sort();
	slt.show();
	slt.clear();
	slt.show();
*/
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值