顺序表
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 }
以上是关于顺序表的主要内容,如果未能解决你的问题,请参考以下文章