C++实现动态顺序表(类和对象)

        在我之前写的博客里,写过用C语言实现顺序表的博客(你们可以去看看哟),最近重新复习了C++,决定用C++重新实现一遍顺序表咦巩固我的基础。这里我用的是类来实现顺序表,下面是我代码的实现,简单易懂:

"test.cpp"

<strong><span style="font-size:18px;">#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
#include "SeqList.h"

void Test1()
{
	SeqList seq;
	for (int i = 0;i < 5;i++)
	{
		seq.PushBack(i);
	}
	cout<<seq<<endl;
	cout<<seq.Capacity()<<endl;

	seq.PushFront(5);
	seq.PushFront(6);
	cout<<seq<<endl;
	cout<<seq.Capacity()<<endl;

	seq.PopBack();
	seq.PopBack();
	seq.PopBack();
	cout<<seq<<endl;

	seq.PopFront();
	seq.PopFront();
	cout<<seq<<endl;
}
void Test2()
{
	SeqList seq;
	for (int i = 0;i < 5;i++)
	{
		seq.PushBack(i);
	}
	cout<<seq<<endl;
	cout<<seq.Find(5)<<endl;
	seq.Insert(seq.Find(2),10);
	cout<<seq<<endl;

	seq.Remove(seq.Find(3));
	cout<<seq<<endl;
	cout<<seq.Size()<<endl;
	seq.Remove(seq.Find(10));
	cout<<seq<<endl;
	cout<<seq.Size()<<endl;
}
void Test3()
{
	SeqList seq;
	for (int i = 0;i < 5;i++)
	{
		seq.PushBack(i);
	}
	cout<<seq<<endl;

	seq.Insert(seq.Find(2),10);
	seq.Insert(seq.Find(0),10);	
	seq.Insert(seq.Find(4),10);
	cout<<seq<<endl;
	seq.RemoveAll(seq.FindData(10));
	cout<<seq<<endl;

	SeqList seq2;
	for (int i = 6;i >0;i--)
	{
		seq2.PushBack(i);
	}
	seq2.Sort(seq2);
	cout<<seq2<<endl;
}
int main()
{
	//Test1();
	//Test2();
	Test3();
	system("pause");
	return 0;
}</span></strong>


"SeqList.h"

<strong><span style="font-size:18px;">#pragma once
#include <assert.h>
typedef int DataType;
class SeqList
{
	friend ostream& operator<<(ostream& os,SeqList seq);
public:
	SeqList()
		:_size(0)
		,_capacity(0)
		,_data(NULL)
	{}
	~SeqList()
	{
		if (_data)
		{
			delete[] _data;
			_data = NULL;
		}
		_size = 0;
		_capacity = 0;
	}
	//拷贝构造
	SeqList(const SeqList& seq)
	{
		_data = new DataType[seq._capacity];
		//内存拷贝
		memcpy(_data,seq._data,sizeof(DataType)*seq._size);
		_size = seq._size;
		_capacity = seq._capacity;
	}
public:
	bool Empty()
	{
		return _size==0;
	}
	size_t Size()
	{
		return _size;
	}
	size_t Capacity()
	{
		return _capacity;
	}
	void PushBack(const DataType& data)
	{
		CheckCapacity();
		_data[_size++] = data;
	}
	void PushFront(const DataType& data)
	{
		CheckCapacity();
		for (int i = _size;i > 0;i--)
		{
			_data[i] = _data[i-1];
		}
		_data[0] = data;
		_size++;
	}
	void PopBack()
	{
		if (Empty())
		{
			return;
		}
		else
		{
			_size--;
		}
	}
	void PopFront()
	{
		for (int i = 1;i < _size;i++)
		{
			_data[i-1] = _data[i];
		}
		_size--;
	}
	int Find(const DataType& data)
	{
		for (int i = 0;i < _size;i++)
		{
			if (_data[i] == data)
			{
				//如果找到了,返回当前位置的下标
				return i;
			}
		}
		return -1;
	}
	DataType FindData(const DataType& data)
	{
		for (int i = 0;i < _size;i++)
		{
			if (_data[i] == data)
			{
				//如果找到了,返回当前位置的下标
				return _data[i];
			}
		}
		return NULL;
	}
	//找到某一个位置,在这个位置后面插入数据
	void Insert(int pos,const DataType& data)
	{
		assert(pos != -1);
		CheckCapacity();
		for (int i = _size;i > pos;i--)
		{
			_data[i] = _data[i-1];
		}
		_data[pos+1] = data;
		_size++;
	}
	//找到要删除的位置,删除该位置上的数据
	void Remove(int pos)
	{
		if (_size != 0)
		{
			assert(pos != -1);
			for (int i = pos;i < _size-1;i++)
			{
				_data[i] = _data[i+1];
			}
			_size--;
		}
	}
	void RemoveAll(const DataType& data)
	{
		if (_size != 0)
		{
			int i = 0;
			while (i < _size)
			{
				if (_data[i] == data)
				{
					for (int j = i;j < _size-1;j++)
					{
						_data[j] = _data[j+1];
					}
					_size--;
				}
				else
				{
					i++;
				}
			}
		}
	}
	void Sort(SeqList seq)
	{
		int i = 0;
		int j = 0;
		for (i = 0;i < _size-1;i++)
		{
			for (j = i;j < _size-1-i;j++)
			{
				if (seq._data[j] > seq._data[j+1])
				{
					swap(seq._data[j],seq._data[j+1]);
				}
			}
		}
	}
private:
	void CheckCapacity()
	{
		if (_size >= _capacity)
		{
			int newcapacity = 2*_capacity+5;
			DataType* tmp = new DataType[newcapacity];
			memcpy(tmp,_data,sizeof(DataType)*_size);
			delete[] _data;
			_data = tmp;
			_capacity = newcapacity;
		}
	}
private:
	int _size;
	int _capacity;
	DataType* _data;
};

//重载输出运算符
ostream& operator<<(ostream& os,SeqList seq)
{
	for (int i = 0;i < seq._size;i++)
	{
		os<<seq._data[i]<<" ";
	}
	return os;
}</span></strong>


你可能感兴趣的:(C++,类,顺序表,功能函数)