前言:线性表
讲顺序表之前先讲讲线性表。
- 线性表:种数据结构,用来表示具有相同类型的有限个数据元素的集合。
- 线性表的性质:
- 有序性:线性表中的数据元素是按一定顺序排列的,每个元素都有确定的位置
- 唯一性:除第一个元素外,每个元素都有唯一的前驱;除最后一个元素外,每个元素都有唯一的后继
- 长度有限:线性表包含的元素个数是有限的
- 线性表主要有两种存储方式:顺序表和链表。
- 链表相关性质可以参考:C、C++常用数据结构:链表-优快云博客
顺序表
- 定义:用一组地址连续的存储单元依次存储线性表中每个数据元素。
- 逻辑关系相邻的两个元素在物理位置上也相邻
- 测试用例如下:
#include <iostream>
using namespace std;
/**
* 创建顺序表模板类
*/
template <typename T>
class sqList
{
private:
int Maxsize; // 最大长度
T *elements; // 顺序表首地址
int length; // 顺序表当前长度
public:
// 线性表构造函数
sqList(int maxsize = 10) : Maxsize(maxsize)
{
elements = new T[maxsize];
length = 0;
}
// 返回当前线性表长度
int listLength()
{
return length;
}
// 返回线性表长度最大值
int listMaxsize()
{
return Maxsize;
}
// 判断线性表是否为空
bool isEmpty()
{
return length == 0;
}
// 插入元素
void insertElement(T elem, int pos)
{
if (isEmpty())
{
elements[length++] = elem;
}
else
{
for (int i = length; i > pos; i--)
{
elements[i] = elements[i - 1];
}
elements[pos - 1] = elem;
length++;
}
}
// 删除元素
void deleteElement(int pos)
{
for (int i = pos - 1; i < length - 1; i++)
{
elements[i] = elements[i + 1];
}
length--;
}
// 遍历打印线性表
void listPrint()
{
for (int i = 0; i < length; i++)
{
cout << elements[i] << " ";
}
cout << endl;
}
};
int main(int argc, char const *argv[])
{
sqList<int> sq(20);
sq.insertElement(3, 1);
sq.insertElement(44, 2);
sq.listPrint();
sq.insertElement(6, 3);
sq.listPrint();
cout << sq.listLength() << endl;
cout << sq.listMaxsize() << endl;
sq.deleteElement(2);
sq.listPrint();
cout << sq.listLength() << endl;
return 0;
}
- 顺序表的插入和删除操作是基于数组实现的,因此涉及到元素的移动,从上面的
void insertElement(T elem, int pos)
和void deleteElement(int pos)
就可以看出。 - 插入操作最坏的情况下(在顺序表的开头插入),需要移动所有的元素,时间复杂度为
O(n)
- 删除操作最坏的情况下(在顺序表的开头删除),需要移动所有的元素,时间复杂度为
O(n)