【数据结构·C语言版】线性表的顺序存储结构

线性表的顺序存储结构是把线性表中所有元素按照逻辑顺序依次存储到一块连续的存储空间。在C语言程序中,常用数组来表示一块连续的存储空间。

图片

如图所示,逻辑相邻的两个元素,在物理存储上也相邻。所有的元素,在物理存储上相邻排放。

图片

假设对两个多项式求和,抽取操作对象,可以知道操作对象是多项式的系数。将两个多项式的系数作为两个线性表中的元素,然后按照次序映射到物理存储中,再基于物理结构设计程序,就可以实现两个多项式的求和。

图片

在这个案例中,两个多项式的指数连续,所以在抽取操作对象的时候,只需要考虑各项的系数,因为把各项系数放到数组中,各项系数对应数组的下标刚好等于各项的指数,也就不需要重复存储各项指数了。

图片

假设两个多项式的各项指数不再连续,有很大的跳跃性,那么按照前一种方式存储就不再合理,会造成很大的内存浪费。此时,抽取操作对象,就需要包含系数和指数,将系数和指数作为一个二元组,然后依次映射到存储中。

图片

对比前后两个多项式,在存储映射的时候,只是将每个元素进行扩展,而元素本身之间的关系并没有改变(一对一)。

这是线性表映射到顺序存储结构的一个案例,它的核心思想是先抽取操作对象,然后将操作对象放到一个数组中存储起来。需要注意的是,由逻辑映射到存储结构的时候,既要存储数据元素本身,又要存储元素之间的关系。

1、本文案例基于C语言程序实现,首先用静态数组来实现该案例,定义结构体类型,完成逻辑结构到物理结构的映射。

#define MaxSize 5typedef struct{  double coefficient;//系数  int exponent;//指数}ElemType;typedef struct{  ElemType data[MaxSize];  int length;//记录线性表的长度}SqList;

在这个结构体类型定义中,给定了一个固定长度的数组data用于存储数据元素,数组元素的数据类型由ElemType给定,且length能够记录线性表中一共有多少个数据元素。

数组存储元素本身肯定没问题,但元素之间的关系是否也存储了呢?如果没有存储,从逻辑到物理的映射必然失败。因为如果没有存储元素之间的关系,就无法由物理结构再恢复到逻辑结构。

其实在数组这种存储结构中,是存储了元素之间的关系的,因为数组元素本身是相邻连续的,线性表的元素也是相邻的,这就使得元素自然形成了一对一的关系。

以两个多项式求和为例,用静态数组来解决求和问题,具体实现方法请参考文章【数据结构·C语言版】线性表的顺序存储结构(静态数组实现)icon-default.png?t=N7T8http://mp.weixin.qq.com/s?__biz=MzIzODAxNjE1OQ==&mid=2247490261&idx=1&sn=a0f5cff2d7f3784432ea782f6a56966f&chksm=e93e9925de49103341ad57e2038d231c2125fc70ef6d33262398755d1423251776bf5ef34156&scene=21#wechat_redirect

2、再用动态数组来实现该案例,定义结构体类型,完成逻辑结构到物理结构的映射。

  • #define SIZE 5#define INCEMENT 2 typedef struct{ double coefficient;//系数 int exponent;//指数}ElemType;typedef struct { ElemType *data; int length;//记录元素的个数 int size;//记录数组的大小}SqList;

在这个结构体类型定义中,存储数据元素的数组由一个指针data指向,而该数组需要在初始化的时候动态申请,并不是在定义SqList类型变量的时候直接得到。

与静态数组不同的是,在这个类型定义中,不仅用length来记录元素个数,还用size来记录整个数组的大小,这是为了防止动态内存泄漏。

以两个多项式求和为例,用动态数组来解决该求和问题,具体实现方法请参考文章【数据结构·C语言版】线性表的顺序存储结构(动态数组实现)icon-default.png?t=N7T8http://mp.weixin.qq.com/s?__biz=MzIzODAxNjE1OQ==&mid=2247490262&idx=1&sn=ff0989f0e45f75c387e8cfda4424540c&chksm=e93e9926de491030013ebd257a49e8bd553705a60dcf631e8df323d2a87145525bf8e3dea7b8&scene=21#wechat_redirect

不管是静态数组实现,还是动态数组实现,本质都是数组,只不过是两种数组所在的内存位置不同,某些特性存在差异。在操作的时候,操作方式基本相同。

1、插入数组元素

图片

当插入一个元素的时候,需要将插入点后面的元素向后移动,腾出插入位置,才可以插入新元素。根据插入位置不同,插入算法的时间复杂度也不一样。

图片

2、删除数组元素

图片

删除一个元素的时候,其实是用后面的元素覆盖前面的元素,所以被删除元素位置后面的元素整体向前移动一个位置,最后一个元素其实并没有变,但是数组长度length减少1。根据删除位置不同,删除算法的时间复杂度也不一样。

图片

以上是线性表的顺序存储实现的两个案例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值