线性表——顺序表
线性表概念
线性表是一种最基本、最简单、也是最常用的一种数据结构。一个线性表是 n 个具有相同特性的数据元素的有限序列。线性表中数据元素的对应关系是一对一,第一个元素没有直接前驱元素,最后一个元素没有直接后继元素,其他的元素都有唯一的前驱和后继元素。
顺序表
顺序表是指在内存中以数组的形式保存的线性表,用一组地址连续的存储单元依次存储线性表中的元素,使逻辑结构相邻的两个元素存储在相邻的物理存储单元中,即顺序存储结构。
顺序表定义
MAXSIZE 为顺序表的最大允许存放多少个元素
定义顺序表的结构体变量,data 代表存放元素值的数组,因为数组中每个相邻元素在内存中的物理地址也是相邻的,length 表示顺序表中现有元素的个数,即顺序表的长度
1 |
|
顺序表初始化
初始化的过程就是内存中申请了顺序表结构体的资源后,将顺序表的长度设置成 0,即新生成的空的顺序表,需要传入顺序表结构体的指针作为参数
1 | void Initlist(Seqlist* s) |
判断顺序表是否为空
判断顺序表是否为空的过程就是取出结构体中 length 的值,检测其是否为 0
1 | int Listempty(Seqlist* s) |
按照元素索引查找元素
按照元素索引查找元素,首先需要检测输入的 index 是否合法,如果输入合法,即取出该索引位置的元素值并返回 1,不合法就返回 0
1 | int Searchforindex(Seqlist* s, int index, int* e) |
按照元素值查找元素
使用 for 循环遍历结构体中存放元素值的数组,使传入的值与数组中的值一一比对,成功返回 1,失败返回 0
1 | int Searchfordata(Seqlist* s, int d) |
在指定索引位置插入元素
首先检测 index 是否合法,再判断顺序表是否已满,满就返回 1,符合就给索引位置的数组元素赋值,并使顺序表长度 +1 后返回 1
1 | int Insertlist(Seqlist* s, int index, int d) |
删除指定索引位置的元素
同样先检测 index,非法返回 -1,然后通过 for 循环将 index 位置后(包括 index)的元素全部前移一位来确保顺序表的连续性,length - 2 的意思:如果顺序表是满状态,最后一位元素的 index 是 length - 1,删除一位之后只需要执行道 length - 2 的元素就可以实现元素前移,最后将 length - 1 并返回 1
1 | int Deletelist(Seqlist* s, int index) |
总结
(一)优点:无须关心表中元素之间的关系,所以不用增加额外的存储空间;可以快速地取表中任意位置的元素。
(二)缺点:插入和删除操作需要移动大量元素。使用前需事先分配好内存空间,当线性表长度变化较大时,难以确定存储空间的容量。分配空间过大会造成存储空间的巨大浪费,分配的空间过小,难以适应问题的需求。