02线性表
线性表
线性表的定义——零个或多个数据元素的有限序列
线性表特点:
- 数据元素之间是有序的
- 数据元素之间是一对一的关系
- 有限性(线性表的数据元素个数是有限的)
注意:零个数据元素的有限序列被称为空表
线性表的数据元素个数是有限的
线性表的抽象数据类型
ADT 线性表(List)
Data
1、线性表数据元素是一个集合{a_1,a_2,a_3....,a_n},数据元素的类型 DataType(int,char,自定义)
2、前驱——除了第一个元素a_1之外,每个元素有且只有一个直接的前驱元素
3、后继——除了最后a_n之外,每个元素有且只有一个直接的后继元素
4、每个数据元素之间的关系是一对一的关系
Operation
InitList(*List) 创建一个空的线性表List
InsertElement(*List, index,elem) 在线性表List的 index下标处插入元素elem
DeleteElement(*List,index,*elem) 删除线性表List中第i个元 素,并返回删除元素的指针e
GetLenght(*List) 返回线性表的元素个数
IsEmpty(*List) 检查是否是空的线性表
ClearList(*List) 清除线性表
GetElement(*List,index,*elem) 返回该下标index对应的元素
endADT
线性表的顺序存储
线性表的顺序存储结构,是指用一段地址连续的存储单元依次存储线性表的数据元素
1、我们需要定义线性表的最大存储空间
# define MAX_SIZE 255
2、线性表里需要有统一类型的元素集合
typedef int ElemType;起别名 int————ElemType
例如:
typedef struct{
int id;
char *name;
}ElementType;
3、定义顺序表结构
typedef struct{
ElementType datas[MAX_SIZE];
int length;
}
描述线性表的顺序存储结构需要三个属性:
- 存储空间的起始位置:数组datas的存储位置
- 线性表的最大存储容量:数组长度MAX_SIZE
- 线性表的当前长度:length
地址计算方法: 下标是从零开始的
第n个元素的内存地址 = 数组的内存地址 + 第n个元素的下标n-1
访问顺序表的元素:
可用 *(datas + 0) 访问第一个元素
一直到 *(datas + n-1)最后一个元素
position 位置,从1开始
index 下标,从0开始
顺序结构的插入与删除
顺序表插入数据元素
将数据元素a插入到顺序表(a_1,a_2,a_3,...,a_i,a_i+1,..,a_n)下标为i的位置
下标为i及下标为i以后的所有数据元素后移
下标i的位置放入数据元素a
注意:
- 插入元素后的顺序表长度变为n+1;
- 插入元素后,最后一个元素的下标变为n;
- C语言数组实现时,顺序表长度不能超过它的最大长度;
顺序表删除数据
将第i个数据元素从顺序表(a_1,a_2,....,a_i,a_i+1,..,a_n)中删除
-
找到第i个位置的数据元素
-
将第i个数据元素以后的数据元素依次覆盖前一个位置
-
顺序表当前长度减1
线性表顺序存储结构的优点:
- 无需为表示 表中元素之间的逻辑关系而增加额外的存储空间
- 可以快速地存取表中任意位置的元素
线性表顺序存储结构的缺点:
- 插入和删除操作需要移动大量的元素
- 当线性表长度变化较大时,难以确定存储空间的容量
- 造成空间的“碎片”
由于搬运的时间成本,更多笔记分享请转至https://blog.csdn.net/weixin_42248871
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix