线性表
数据结构分为{数据逻辑结构,数据存储结构,数据的运算}
逻辑结构{线性{线性表,栈(特殊线性表,队列(特殊线性表),字符串,数组,广义表)},非线性(树形结构(一对多)图形结构(多对多))}
存储结构{顺序存储,链式存储}
运算:检索,排序,插入,删除,修改等
线性表的定义和特点
线性表是具有相同特性的数据元素的一个有限序列
(a1,a2,...ai-1,ai,ai+1,...,an)
a1(起始节点)
an(终端节点)
ai(数据元素)
ai-1为ai的直接前继
ai+1为ai的直接后继
下标,是元素的序号,表示元素在表中的位置
n=0为空表
线性表:
由n(n>=0)个数据元素(结点)a1,a2,...an组成的有限序列
其中数据元素的个数n定义为表的长度
当n=0时称为空表
将非空的线性表(n>0)记作:(a1,a2,...,an)
这里的数据元素ai(1<=i<=n)只是一个抽象的符号,其具体含义在不同的情况下可以不同
同一线性表中的元素必定具有相同特性,数据元素间的关系是线性关系
从以上例子可看出线性表的逻辑特征是:
在非空线性表,有且仅有一个开始结点a1,他没有直接前驱,而且仅有一个直接后继a2
有且仅有一个终端结点an,他没有直接后继,而且仅有一个直接前驱an-1
其他都有且只有一个直接前驱和一个直接后继
【顺序存储结构存在问题】
存储空间分配不灵活
运算的空间复杂度高
链式存储结构
线性表中数据元素的类型可以为简单类型,也可以为复杂类型许多实际应用问题所涉的基本操作有很大相似性,不应为每个具体应用单独编写一个程序
从具体应用中抽象出共性的逻辑结构和基本操作(抽象数据类型),然后实现其存储结构和基本操作
顺序存储定义:把逻辑上相邻的数据元素存储在物理地址上相邻的存储单元的存储结构
占用一片连续的存储空间
顺序表的特点:以物理位置相邻表示逻辑关系任一元素均可随机存取(优点)
顺序表--》数组
线性表长可变(插入删除)
数组长度不可动态定义
SqList;
L.data=(ElemType)malloc(sizeof(ElemType)MaxSize)
molloc(m)函数,开辟m字节长度的地址空间,并返回这段空间的首地址
sizeof(x)运算,指针变量x的长度
free(p)函数,释放指针p所指变量的存储空间,即彻底删除一个变量。
头文件需要<stdlib.h>
传值(相残发生改变师残部改变)
传址(形参变化,实参发生变化)
中间变量为基本数据类型
传址(形参变化,实参不发生变化)
中间变量为指针类型
参数传递数据量过大时,用引用比用一般变量传参的时间和空间效率好。
线性表的顺序存储表示
平均查找长度ASL:
为确定记录在表中的位置,需要与给定值进行比较的关键字的个数的期望叫做查找算法的平均查找长度。(1+。。+7/7)
查找平均长度
假设n个记录
ASLss=(n+1)/2
顺序表的插入
插入在最后(直接插入)
插入在中间(从最后一个元素开始一次王后般,将前一个半岛后面)
插入位置在最前面(从最后一个元素依次向后移)
考虑异常情况(1、插入位置不对;2、内存不够发生溢出)
算法思想:
判断插入位置是否合法
判断存储空间是否已满
算法时间主要消耗在移动元素的操作上
若插入在尾结点之后,则根本无需移动(特别快)
若插入在首结点之前,则表中元素全部后移(特别慢)
若要考虑在各种位置插入(共n+1种可能)的平均移动次数,该如何计算?
期望值: 插入位置概率为1/(n+1)
Eins=1/(n+1)(n+...+1+0)=n/2
时间复杂度O(n)
删除算法
删除位置:
在最后
在中间
最前面
平均顺序:(n-1)/2
时间复杂度:O(n)
顺序表优缺点:
存储密度大(结合本身所占存储量/结点结构所占存储量)
可以随机存取表中任一元素
缺点:
再插入、删除某一元素时,需要移动大量元素
浪费存储空间
属于静态存储形式,数据元素的个数不能自由扩充
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义