#pragma once
#include
using namespace std;
#define InitSize 10
#define IncSize 5
template<class T>
class SeqList
{
public:
SeqList(int length = InitSize);
~SeqList();
public:
bool ListInsert(int i, const T& e);//在第i个位置插入
bool ListDelete(int i);//删除
bool GetList(int i, const T& e);//获取元素
int LocateElem(const T& e);//按元素查找顺序表中第一次出现的位置
void DispList();//显示
int ListLength();//获取长度
void ReverseList();//翻转
private:
void InvreaseSize();//当顺序表满时扩容
private:
T* m_data;//存放的数据
int m_length;//存放的长度
int m_maxsize;//最大容量
};
template<class T>
SeqList<T>::SeqList(int length)
{
m_data = new T[length];
m_length = 0;
m_maxsize = length;
}
template<class T>
SeqList<T>::~SeqList()
{
delete[] m_data;
m_length = 0;
}
template<class T>
bool SeqList<T>::ListInsert(int i, const T& e)//在第i个位置插入
{
if (m_length >= m_maxsize)//满了就扩容
{
InvreaseSize();
}
if (i<1 || i>(m_length + 1))
{
cout << "插入位置不合法" << endl;
return false;
}
//插入
for (int j=m_length;j >= i;--j)
{
m_data[j] = m_data[j-1];
}
m_data[i-1] = e;
m_length++;
cout << "插入成功" << endl;
return true;
}
template<class T>
bool SeqList<T>::ListDelete(int i)//删除
{
if (m_length < 1|| i >(m_length + 1)||i < 1)
{
cout << "删除位置不合法" << endl;
return false;
}
for (int j = i; j < m_length; j++)
{
m_data[j - 1] = m_data[j];
}
m_length--;
cout << "删除成功" << endl;
return true;
}
template<class T>
bool SeqList<T>::GetList(int i, const T& e)//获取元素
{
if (m_length < 1 || i >(m_length + 1) || i < 1)
{
cout << "获取位置不合法" << endl;
return false;
}
e = m_data[i - 1];
cout<< "该元素为:" << m_data[i - 1] << endl;
return true;
}
template<class T>
int SeqList<T>::LocateElem(const T& e)
{
for (int i = 0; i < m_length; i++)
{
if (m_data[i] == e)
{
cout << "找到了:" << e << " ";
//cout << "找到了:" << m_data[i]<
return i+1;
}
}
return -1;
}
template<class T>
void SeqList<T>::DispList()
{
for (int i = 0; i < m_length; i++)
{
cout << m_data[i] << " ";
}
cout << endl;
}
template<class T>
int SeqList<T>::ListLength()//获取长度
{
return m_length;
}
template<class T>
void SeqList<T>::ReverseList()//翻转
{
if (m_length < 1 )
{
return ;
}
T temp;
for (int i = 0; i < m_length / 2; i++)
{
temp = m_data[i];
m_data[i] = m_data[m_length - 1 - i];
m_data[m_length - 1 - i] = temp;
}
cout << "反转完成" << endl;
}
template<class T>
void SeqList<T>::InvreaseSize()//扩容
{
T* p = m_data;//先把原先空间指针保留
m_data = new T[m_maxsize + IncSize];//开辟新空间,扩容
for (int i = 0; i < m_length; i++)//把旧数据搬到新空间
{
m_data[i] = p[i];
}
m_maxsize = m_maxsize + IncSize;
delete[] p;//释放旧空间
}
#include"SeqList.hpp"
void test()
{
SeqList<int>sl(10);
//插入
for (int i = 0; i < 20; i++)
{
sl.ListInsert(i+1, i + 10);
}
sl.DispList();
//删除
sl.ListDelete(1);
int val = 0;
//sl.GetList(1,val);
//查找
int value = sl.LocateElem(20);//-1未找到
if (value != -1)
{
cout << "下标为:" << value<< endl;
}
//打印
sl.DispList();
//输出长度
cout << sl.ListLength() << endl;
//反转
sl.ReverseList();
sl.DispList();
}
int main()
{
test();
system("pause");
return 0;
}