顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。
这样的存储方式使得线性表逻辑上相邻的元素,其在物理存储单元中也是相邻的。只要知道了第一个元素的存储地址,就可以知道线性表中任何一个元素的存储地址
#include<iostream>
using namespace std;
template<class T>
class Dsqlist
{
private:
T* data;
int length;
int capcity;
public:
Dsqlist()//构造函数
:data(NULL)
, length(0)
, capcity(0)
{}
Dsqlist(const Dsqlist & list)//拷贝构造函数
: data(new int[list.length])
, length(list.length)
, capcity(list.capcity)
{
memcpy(data,list.data,sizeof(int)*length);
}
~Dsqlist()//析构函数
{
if (data != NULL)
{
delete[] data;
length = 0;
capcity = 0;
}
}
void checkcap();//测容,扩容
void push_back(int x);//尾插
void print();
void insert(int i, int x);//指定位置插入
void llength();//有效元素的长度
void lcapcity();//总容量
void erase(int i);//指定位置的删除
void pop_back();//尾删
void find(int i);//查找指定位置的元素
};
template<class T>
void Dsqlist<T>::checkcap()//测容,扩容
{
if (length == capcity)
{
capcity += 2;
data =(int*) realloc(data, capcity*sizeof(int));
}
}
template<class T>
void Dsqlist<T>::push_back(int x)//尾插
{
checkcap();
data[length++] = x;
}
template<class T>
void Dsqlist<T>::insert(int i,int x)//指定位置插入元素
{
checkcap();
i--;
if (i<0 || i>length)
cout << "输入错误" << endl;
else
{
int j;
for (j = length; j > i; j--)//1 2 3 4
data[j] = data[j - 1];
length++;
data[i] = x;
}
}
template<class T>
void Dsqlist<T>::erase(int i)//指定位置删除元素
{
i--;
if (i<0 || i>length)
cout << "输入错误" << endl;
else
{
int j;
for (j = i; j<length; j++)
data[j] = data[j + 1];
length--;
}
}
template<class T>
void Dsqlist<T>::pop_back()//尾删
{
if (length == 0)
cout << "空表" << endl;
else
length--;
}
template<class T>
void Dsqlist<T>::find(int i)//查找指定位置的元素
{
i--;
if (i<0 || i>length)
cout << "输入错误" << endl;
else
cout <<"元素为:"<< data[i]<< endl;
}
template<class T>
void Dsqlist<T>::llength()//有效元素的长度
{
cout << "长度为:" << length << endl;
}
template<class T>
void Dsqlist<T>::lcapcity()//总容量
{
cout << "容量为:" << capcity << endl;
}
template<class T>
void Dsqlist<T>::print()//输出
{
if (data == NULL)
cout << "空表" << endl;
else
{
int i;
cout << "data: ";
for (i = 0; i < length; i++)
cout << data[i] << " ";
cout << endl;
}
}
int main()
{
Dsqlist<int> l1;
cout << "l1.push_back(2)" << endl;
cout << "l1.push_back(3)" << endl;
cout << "l1.push_back(4)" << endl;
l1.push_back(2);
l1.push_back(3);
l1.push_back(4);
l1.print();
cout << "l1.insert(1,9)" << endl;
l1.insert(1,9);
l1.print();
cout << "l1.pop_back();" << endl;
l1.pop_back();
l1.print();
cout << "l1.find(3)" << endl;
l1.find(3);
l1.print();
cout << "l1.erase(2)" << endl;
l1.erase(2);
l1.print();
l1.llength();
l1.lcapcity();
Dsqlist<int> l2(l1);
cout << "Dsqlist<int> l2(l1)后"<<endl;
l2.print();
return 0;
}
结果如下