数据结构 顺序表及其实现
1. 线性表的定义
线性表是n 个具有相同特性的数据元素的有序序列。
线性表在逻辑上可以想象成是连续的⼀条线段,线段上有很多个点,⽐如下图:
2. 线性表的顺序存储-顺序表
线性表的顺序存储就是顺序表。
如果下图中的⽅格代表内存中的存储单元,那么存储顺序表中这个元素就是放在连续的位置上:
3、创建及其实现方式
const int N = 1e6 + 10; // 定义静态数组的最⼤⻓度
int a[N], n; // 直接创建⼀个⼤数组来实现顺序表, n 表⽰当前有多少个元素
尾插
代码实现:
//尾插
void push_back(int x)
{
a[++n] = x; // 下标为 0 的位置空出来
// 这样操作⼀般根据个⼈习惯,也可以从 0 开始计数
// 不过有些问题从 1 计数,处理起来可以不⽤考虑边界情况
头插
代码实现: 要把所有的元素全部右移⼀位,然后再放到头部位置
// 头插 void push_front(int x)
{
// 要把所有的元素全部右移⼀位,然后再放到头部位置
for(int i = n; i >= 1; i--) // 循环的顺序是否可以改变?
{
a[i + 1] = a[i];
}
a[1] = x; // 把 x 放在⾸位
n++; // 不要忘记总个数 +1
}
任意位置插⼊
代码实现:
// 任意位置插⼊ - 在位置 p 处,插⼊⼀个 x
void insert(int p, int x)
{
for(int i = n; i >= p; i--) // 注意顺序不要颠倒
{
a[i + 1] = a[i];
}
a[p] = x;
n++; // 不要忘记总个数 +1
}
尾删
代码实现:
void pop_back()
{
n--;
}
头删
代码实现:
// 头删
void pop_front()
{
// 把所有元素向前移动⼀位
for(int i = 2; i <= n; i++) // 顺序是否能颠倒?
{
a[i - 1] = a[i];
}
n--; // 总个数 -1
}
任意位置删除
代码实现:
// 任意位置删除
void erase(int p)
{
for(int i = p + 1; i <= n; i++)
{
a[i - 1] = a[i];
}
n--; // 总个数 -1
}
按值查找
代码实现:
// 查找这个数第⼀次出现的位置,找不到返回 0
int find(int x)
{
for(int i = 1; i <= n; i++)
{
if(a[i] == x) return i;
}
return 0;
}
按位查找
代码实现:
// 返回 p 位置的数
int at(int p)
{
return a[p];
}
修改元素
代码实现:
// 把 p 位置的数修改成 x
void change(int p, int x)
{
a[p] = x;
}
清空顺序表
代码实现:
// 清空顺序表
void clear()
{
n = 0;
}