LV03-03-数据结构-线性表-顺序表基础
本文主要是数据结构——顺序表基础相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。
点击查看使用工具及版本
Windows | windows11 |
Ubuntu | Ubuntu16.04的64位版本 |
VMware® Workstation 16 Pro | 16.2.3 build-19376536 |
SecureCRT | Version 8.7.2 (x64 build 2214) - 正式版-2020年5月14日 |
开发板 | 正点原子 i.MX6ULL Linux阿尔法开发板 |
uboot | NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03) |
linux内核 | linux-4.15(NXP官方提供) |
STM32开发板 | 正点原子战舰V3(STM32F103ZET6) |
点击查看本文参考资料
参考方向 | 参考原文 |
--- | --- |
一、顺序表基础
1.顺序表表示
若将线性表 L 中的各元素依次存储于计算机一片连续的存储空间。
$$
L = (a_0, a_1, …, a_{i-1},a_i,a_{i+1}, …,a_{n-1})
$$
设$Loc(a_i)$为$a_i$的地址,其中$p = Loc(a_0) $,每个元素占 m 个单元,那么就有$Loc(a_i) = p + i*m$。
【注意】顺序表存储数据时,会提前申请一整块足够大小的物理空间,后边这块物理空间的大小是无法再变化的。其实,顺序表存储数据使用的就是数组。
2.顺序表特点
(1)逻辑上相邻的元素 $a_i$, $a_{i+1}$,其存储位置也是相邻的。
(2)对数据元素 $a_i$ 的存取为随机存取或按地址存取。
(3)存储密度高。
1 | 存储密度 D = 数据结构中元素所占存储空间 / 整个数据结构所占空间 |
【缺点】对顺序表进行插入和删除等运算的时间复杂度较差。
二、顺序表框架
1.存储结构表示
在 C 语言中,可以借助数组来描述线性表的顺序存储结构,不过我们需要加一个变量来指示目前顺序存储结构的线性表中当前数据的个数,存储结构可用下图表示:
2.结构体定义
上边我们知道,构成一个顺序表,我们需要创建一个数组来存储数据,还需要一个变量来指示当前顺序表中数据的个数,所以就需要使用结构体来表示一个顺序表啦。使用顺序表存储数据时,需要使用的结构体至少需要两个成员,一个是存储数据用的数组,一个是代表顺序表中元素个数的变量。
【说明】顺序表英文名称为 sequence list ,这里就用 seqlist 代表顺序表啦。
1 | typedef int data_t; |
该段程序定义了一个结构体数据类型 __seqlist,并对该结构体类型和该结构体类型指针进行了重命名。
【说明】该种方式是对方式一的简化,可以省略 sqlist 。
1 | typedef int data_t; |
该段程序定义了一个结构体数据类型 __seqlist,同时对该结构体类型和该结构体类型指针进行了重命名。
当我们为创建的结构体类型进行重命名之后,我们就可以简化结构体变量的定义了。
常规写法 | 等价写法 |
---|---|
struct __seqlist L; | _seqlist L; |
struct __seqlist * p; | _seqlistlink p; |
3.框架实现
接下来我们需要搭建一个顺序表的实现框架,它一共需要三个文件: seqlist.c 、 seqlist.h 和 main.c 。
3.1 main.c
该文件主要是对顺序表进行调用和测试。
1 |
|
3.2 seqlist.c
这个文件主要是对顺序表各种操作的实现文件。
1 |
|
3.3 seqlist.h
这个文件主要是顺序表结构体定义和相关函数的声明。
1 |
|
3.4 Makefile
这个文件主要是用于编译程序。
1 | ##============================================================================# |
3.5编译测试
框架创建完毕后,可以在命令行输入以下命令进行测试,观察是否有报错,保证没有错误以便于后边相关操作的实现。
1 | make # 编译程序 |
上边的程序中由于功能还没实现,所以可能会有警告。