1. 程式人生 > >順序表類:class SeqList

順序表類:class SeqList

//順序表,不是字串沒'\0'
//預設4個,增刪6個,查詢,列印,容量檢測

#pragma once

#include <iostream>
#include <assert.h>
using namespace std;

typedef int DataType;

class SeqList
{
public:

	SeqList()
		:_arr(NULL)
		,_capacity(0)
		,_size(0)
	{}

	~SeqList()
	{
		Release();
	}
	
	//拷貝構造沒有帶參構造借用所以不能寫現代寫法
	SeqList(const SeqList& s)
	{	
		//不拷貝多餘空間
		_arr = new DataType[s._size];	//開 s._size 個 DataType 型別的空間	
		memcpy(_arr, s._arr, s._size*sizeof(DataType));
		_size = _capacity = s._size;

	}

	SeqList& operator=(SeqList s)
	{
		swap(_arr, s._arr);
		swap(_size, s._size);
		swap(_capacity, s._capacity);
		return *this;
	}
	
	void Release()
	{
		if(_arr)
		{
			delete[] _arr;
			_size = _capacity = 0;
			_arr = NULL;
		}
	}
	
	void CheckCapacity();

	void PushBack(DataType x);
	void PushFront(DataType x);
	void Insert(size_t pos, DataType x);
	void PopBack();
	void PopFront();
	void Erase(size_t pos);
	
	void Print();
	size_t Find(DataType x);	//返回第一個下標

private:
	DataType* _arr;
	size_t _size;
	size_t _capacity;
};

void SeqList::CheckCapacity()
{
	if(_size == _capacity)
	{
		_capacity = _capacity*2+1;
		_arr = (DataType*)realloc(_arr, _capacity*sizeof(DataType));
		
	}
}

void SeqList::Print()
{
	size_t i = 0;
	for(i=0; i<_size; i++)
	{
		cout<<_arr[i]<<" ";
	}
	cout<<endl;
}

void SeqList::Insert(size_t pos, DataType x)
{
	assert(pos <= _size);
	CheckCapacity();
	int end = _size - 1;	//防止_size為0時候end是最大正數
	while(end >= (int)pos)
	{
		_arr[end+1] = _arr[end];
		--end;
	}
	_arr[pos] = x;
	++_size;
}

void SeqList::PushBack(DataType x)
{
	Insert(_size, x);
}

void SeqList::PushFront(DataType x)
{
	Insert(0, x);
}

void SeqList::Erase(size_t pos)
{
	assert(pos < _size); //pos為正數,附帶檢查了_size不為0
	//儘量別挪pos,因為如果動了以後可能會用到的時候就找不到了
	for(size_t i = pos; i<_size; i++)
	{
		_arr[i] = _arr[i+1];
	}
	--_size;
}

void SeqList::PopBack()
{
	Erase(_size-1);
}

void SeqList::PopFront()
{
	Erase(0);
}

size_t SeqList::Find(DataType x)
{
	for(size_t i=0; i<_size; i++)
	{
		if(_arr[i] == x)
		{
			return i;
		}
	}
	return -1;
}