顺序表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了顺序表相关的知识,希望对你有一定的参考价值。

线性表是由 相同数据类型 的n个数据元素 组成的 有限序列,一个数据元素可以由若干个数据项组成。其中是唯一的“第一个”数据元素,亦称表头元素, 是唯一的“最后一个”元素,又称表尾元素。线性表分为顺序表和链表两种类型。

  • 线性表中所有元素的数据类型都是相同的
  • 线性表受储存空间限制
  • 线性表中的元素具有逻辑上的顺序性,依次排列

 

顺序表是在计算机内存中以 数组形式 保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。

顺序表最主要特点是可以进行 随机访问,可以通过表头元素的地址和元素的编号(下标)在O(1)时间复杂度内找到指定的元素。

顺序表的不足之处在于插入和删除都需要移动大量元素,从而保持逻辑上和物理上的连续性。

  • 顺序表元素都是一个挨着一个存储,元素都集中在一段区间内,相对存储密度大
  • 顺序表是存储结构,用一组地址连续的存储单元依次存储数据元素。如果两个元素逻辑上是相邻的,则物理位置上也是相邻的
  • 若顺序表中第一个元素起始地址为0,每个元素大小为n,则第i个元素的起始地址为(i-1) * n

 

构造一个顺序表:

首先创建一个模板类Vector,包含私有属性 size(顺序表容量),length(顺序表长度或元素个数), *data(指向存储元素的数组);公有属性 构造函数Vector()和析构函数~Vector():

 

 1 template <typename Type> class Vector {
 2 private:
 3     int size, length;
 4     Type * data;
 5 public:
 6     Vector(int input_size) {
 7         size = input_size;
 8         length = 0;
 9         data = new Type[size];
10     }
11     ~Vector() {
12         delete[] data;
13     }
14 };

 

然后实现顺序表的插入操作:

 1 bool Vector::insert(int loc, Type value) {
 2 // 若插入元素的位置不在正常的数组范围内
 3         if (loc < 0 || loc > length) {
 4             return false;
 5         }
 6 // 若数组的长度达到容量上限
 7         if (length >= size) {
 8             expand();
 9         }
10 // 将准备插入的元素的位置后面所有的元素往后移一位,然后将该元素插入该位置
11         for (int i = length; i > loc; i--) {
12             data[i] = data[i - 1];
13         }
14         data[loc] = value;
15         length++;
16         return true;
17     }

实现顺序表的扩容操作:

1 void Vector::expand() {
2         Type * old_data = data;
3         size *= 2; // 将容量扩大为之前的2倍
4         data = new Type[size]; // 重新开辟一块新的空间
5         for (int i = 0; i < length; i++) {
6             data[i] = old_data[i];
7         }
8         delete[] old_data; // 将原来的空间释放
9     }

实现顺序表的查找操作:

直接枚举所有元素,判断元素的值是否和传入的参数value相等

1 int Vector::search(const Type &value) {
2         for (int i = 0; i < length; i++) {
3             if (data[i] == value) {
4                 return i;
5             }
6         }
7         return -1;
8     }

实现顺序表的删除操作:

 1 bool Vector::remove(int index) {
 2         if (index < 0 || index >= length) {
 3             return false;
 4         }
 5         for (int i = index + 1; i < length; i++) {
 6             data[i - 1] = data[i];
 7         }
 8         length--;
 9         return true;
10     }

实现顺序表的遍历操作:

1 void Vector::print() {
2 for (int i = 0; i < length; i++) {
3 if (i > 0) {
4                 cout << " ";
5           }
6           cout << data[i];
7      }
8      cout << endl;
9 }

 

 

以上是关于顺序表的主要内容,如果未能解决你的问题,请参考以下文章

将数据从底部工作表对话框片段传递到片段

Android 在 FragmentPagerAdapter 中更改片段顺序

从底部工作表对话框片段中获取价值

关于代码片段的时间复杂度

Mysql Innodb 表碎片整理

片段(Java) | 机试题+算法思路+考点+代码解析 2023