c++(模板类)实现顺序表

#pragma once
#include <iostream>
#include <string>
#include <assert.h>
using namespace std;
template<typename T>
class SeqList
{
public:
	SeqList()
		:_a(NULL)
		,_capacity(0)
		,_size(0)
	{} 

	SeqList(const SeqList<T>& s)
		:_size(s._size)
		,_capacity(s._capacity)
		,_a(new T[s._capacity])
	{ 
		 for (size_t i=0;i<_capacity;i++)
		 {
			 _a[i]=s._a[i];
		 }	 
	}
	SeqList<T>& operator= (SeqList<T> s)
	{ 
		if(this!=&s)
		{
			delete _a;
		_a=new T[s._capacity];
		for (size_t i=0;i<s._size;i++)
		{
			_a[i]=s._a[i];
		}
		_capacity=s._capacity;
		_size=s._size;}

		return *this;
	} 
	~SeqList()
	{
		if (_a)
		{
			delete[] _a;
			//free(_a);
			_size = _capacity = 0;
			_a=NULL;
		}
		
	 
	}

	void PushBack(const T& x)
	{
		_CheckCapacity();

		_a[_size] = x; //?
		++_size;
	}

	void PopBack()
	{
		if(_size > 0)
			--_size;
	}

	T& Back()
	{
		assert(_size > 0);
		return _a[_size-1];
	}
	 	size_t Size()
	{
		return _size;
	}

	bool Empty()
	{
		return _size == 0;
	}	 
	void PushFront(const T& x)
	{
		_CheckCapacity();
		size_t end= _size;
		while (end-->=1)
		{
			_a[end+1]=_a[end];
		}
		_a[0]=x;
		++_size;
	}
	void popFront()
	{
		if (_size==0)
		{
			return;
		}
		else	if(_size > 0)
		{
			--_size;
			_a[_size]=_a[_size+1];
		}
			   
	}
 
	void    Print()
	{
		for (size_t i = 0; i < _size; ++i)
		{
			cout<<_a[i]<<" ";
		}
		cout<<endl;
	}

protected:
	void _CheckCapacity()
	{
		if (_size >= _capacity)
		{
			 
			_capacity = _capacity*2+3;
			T* tmp = new T[_capacity];
			if (_a)
			{
				// 优化
				//memcpy(tmp, _a, sizeof(T)*_size);    //若模板类是内置类型或string字符串小于16时使用memcpy完全可以,
				                                       //但是当字符串大于15时,这种方式就会出现问题,因为此时的数据
				                                        //就不是存放于buf中了,而是用ptr指针指向一个空间保存数据,
				                                       //因为memcpy是值拷贝,所以现在会将ptr的地址拷到新的ptr空间,
				                                      //此时是两个指针指向同一块空间,拷贝完成后将就得空间释放时,
				                                      //新的ptr就变成了野指针,所以程序崩溃。
				for (size_t i = 0; i < _size; ++i)
				{
					tmp[i] = _a[i];
				}
				delete[] _a;
			}

			_a = tmp;
		}
	}
 
protected:
	T* _a;
	size_t _size;
	size_t _capacity;
};
// Push / Pop
void TestSeqList1()
{
	SeqList<int> s1;
	s1.PushBack(1);
	s1.PushBack(2);
	s1.PushBack(3);
	s1.PushBack(4);
	
	s1.Print();


	s1.PopBack();
	s1.PopBack();
	s1.PopBack();
	s1.PopBack();
	s1.PopBack();
	s1.Print();
}
// 拷贝、复制运算符的重载
void TestSeqList2()
{
	SeqList<int> s1;
	s1.PushBack(1);
	s1.PushBack(2);
	s1.PushBack(3);
	s1.PushBack(4);
	s1.Print();
	
	SeqList<int> s2(s1);
	s2.Print();

	SeqList<int> s3;

	s3 = s2;
	s3.Print();
}

void TestSeqList3()
{
	// 深层次的深浅拷贝
	SeqList<string> s1;
	s1.PushBack("11111");
	s1.PushBack("222222222");
	s1.PushBack("33");
	s1.PushBack("4444444444444444444444444444444444444444444444 ");
	s1.PushBack("33");
	s1.PushBack("33");
	s1.PushBack("33");
	s1.PushBack("33");
	s1.PushBack("33");

	s1.PushBack("33");

	s1.Print();
}
void TestSeqList4()
{    
	SeqList< int> s4;
	s4.PushFront(1);
	 s4.PushFront(1);
	 s4.popFront();
	 s4.popFront();
	 s4.popFront();
	 s4.Print();
}

#include "SeqList.h"
int main()
{
   TestSeqList1();
    TestSeqList2();
   TestSeqList3();
   TestSeqList4();
 
   return 0;
}




  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用c++实现顺序表:多文件编程,层次清晰,函数有注释 SeqList();//构造函数,存储的元素个数设为0 bool setLength(size_t length);//设置已经存储的元素个数 bool addElement(ElemType element);//把某个元素添加到顺序表末尾 bool addElement(ElemType element , size_t n);//插入一个元素,使其成为第n个元素,其余元素后移 bool delElement();//删除所有的元素 bool delElement(size_t n);//删除第n个元素 bool delElement(string elementDetailType,string elementDetail);//通过某个元素细节找到元素,把这个元素删除 bool replaceElement(ElemType element , size_t n);//使用一个元素,替换掉第n个元素 bool swapElement(size_t n1 , size_t n2);//把第n1个元素和第n2个元素交换 ElemType* getElement();//得到数组头的指针 ElemType* getElement(size_t n);//得到第n个元素的指针 size_t getLength();//得到存储的元素个数 size_t getMaxSize();//得到顺序表容量 bool showElementDetail();//输出所有的元素细节 bool showElementDetail(size_t n);//输出第n个元素的细节 bool showElementDetail(string elementDetailType,string elementDetail);//通过某个元素细节找到元素,输出元素所有细节 size_t findElement(string elementDetailType,string elementDetail);//通过某个元素细节找到元素位置 static int inputAInt(int min = 0,int max = 9,int defaultValue = -1);//从键盘读取,限制为一个min到max间的整数,非法情况返回defaultValue void startControlLoop();//打开控制界面 ~SeqList();//析构函数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值