简单的顺序表中的一些函数以及一些简单的测试

本文介绍了一个使用C++实现的顺序表数据结构。该顺序表支持动态扩容,并提供了多种操作方法,如插入、删除、获取元素等。文章还提供了一个简单的测试函数来验证顺序表的功能。
编译环境是vs2012
#include<windows.h>
#include<assert.h>
#include<iostream>
using namespace std;
/*struct Seqlist
{
	int *_array;
	size_t _size;
	size_t _capacity;

};


void InitSeqlist(Seqlist * q)
{
	assert(q);
	q->_array = new int[3];
	q->_capacity = 3;
	q->_size = 0;
}

void PushBack(SeqList *q,int data)
{
	assert(q);
	q->_array[q->_size++] = data;
}
*/


typedef int DataType;
class SeqList
{
public:
	SeqList()
		:_array(new DataType[3])
		, _capacity(3)
	    , _size(0)
		{}
		SeqList(DataType *array, size_t size)
			:_array(new DataType[size])
			, _capacity(size)
			, _size(size)
		//把数组里的东西搬到顺序表里
		{
			for (size_t i = 0; i < size; i++)
				_array[i] = array[i];
			//memcpy(_array, array, size*sizeof(array[0]));
		}

		SeqList(const SeqList&s);
		SeqList& operator=(const SeqList& s);
		~SeqList()
		{
			if (_array)
			{
				delete[] _array;
				_size = 0;
				_capacity = 0;
			}
		}





		void PushBack(int data)
		{
			_CheckCapacity();
			_array[_size++] = data;
		}


		void PopBack()
		{
			assert(_size);
			--_size;
		}


		void PushFront()//头插和头删效率太高,没有必要实现
		{

		}
		void PopFront()
		{

		}


		void Insert(DataType pos,DataType data)//任意位置插入
		{
			assert(pos <= _size && pos > 0);
			
			_CheckCapacity();
			for (int i = _size - 1; i >= (int)pos; --i)
				_array[i + 1] = _array[i];//后一个搬到前一个
			
			_array[pos] = data;
			_size++;
		}



		void Erase(DataType pos)//任意位置删除
		{
			assert(pos < _size);
			for (int i = pos+1; i < _size; ++i)
				_array[i-1] = _array[i];
			_size--;
		}


		int Size()const
		{
			return _size;
		}

		int Capacity()const
		{
			return _capacity;
		}

		bool empty()const
		{
			return 0 == _size;
		}



		DataType& operator[](int index)//返回的是所存对象的引用,
		{
			return _array[index];
		}

		const DataType& operator[](int index)const
		{
			return _array[index];
		}

		DataType& Front()
		{
			return _array[0];
		}

		const DataType& Front()const
		{
			return _array[0];
		}

		DataType& Back() const
		{
			return _array[_size - 1];
		}

		void Clear()//清空顺序表
		{
			_size = 0;
		}

		//把顺序表中元素个数改变到newsize
		//1. newsize<=_size
		//2._size<newsize<_capacity
		//3.newsize>_capacity  需要增容
		void Resize(int newsize,const DataType& data = DataType()) 
		{
			if (newsize <= _size)
				_size = newsize;
			else if (_size < newsize && newsize < _capacity)
			{
				for (int i = _size; i < newsize; i++)
					_array[i] = data;
			}
			else
			{
				DataType* temp = new DataType[newsize];
				//旧空间中的内容搬到新空间
				for (int i = 0; i < _size; i++)
					temp[i] = _array[i];
				//多出的空间放data
				for (int i = _size; i < newsize; i++)
					temp[i] = data;

				delete temp;
				_array = temp;
				_size = newsize;
				_capacity = newsize;
			}
		}


		/*friend iostream& operator<<(ostream& _cout, const SeqList& s)
		{
			for (size_t i = 0; i < s.Size(); i++)
			{
				cout << s._array[i] << "";
			}
			return _size;
		}
		 */

private:
	void _CheckCapacity()
	{
		if (_size == _capacity)
		{

			//开辟新空间
			DataType* temp = new DataType[(_capacity << 1)];
			//拷贝元素
			for (size_t i = 0; i < _size; i++)
				temp[i] = _array[i];
			//释放就空间
			delete[] _array;
			_array = temp;
			_capacity <<= 1;
		}
	}
private:
    DataType*_array;
	size_t _size;
	size_t _capacity;
};



void FunTest()
{
	int array[] = { 1, 2, 3, 4, 5 };
	SeqList s1(array, sizeof(array) / sizeof(array[0]));
	cout << s1 << endl;
	cout << s1.Size() << endl;
	cout << s1.Capacity() << endl;

	s1.PushBack(6);
	cout << s1 << endl;
	cout << s1.Size() << endl;
	cout << s1.Capacity() << endl; 

	s1.PopBack();
	cout << s1 << endl;
	cout << s1.Size() << endl;
	cout << s1.Capacity() << endl; 
	
	s1.Insert(0, 0);
	cout << s1 << endl;
	cout << s1.Size() << endl;
	cout << s1.Capacity() << endl;

	s1.Erase(0);
	cout << s1 << endl;
	cout << s1.Size() << endl;
	cout << s1.Capacity() << endl;

}

int main()
{
	FunTest();
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值