数据结构复习笔记(2)
第二章 线性表
基本定义
线性表是n个数据元素的有限序列。一个数据元素可以由若干数据项组成,此时将数据元素称为记录,含有大量记录的线性表称为文件。同一线性表中的元素必定具有相同特性(属于同一数据对象)
线性表中有多个元素时,第一个元素有且仅有一个直接后继,最后一个元素有且仅有一个直接前驱,其他元素有且仅有一个直接前驱和一个直接后继
线性表的长度可按需增长或缩短。对于线性表的ADT类型,通常有一些基本操作:构造空表、销毁表、清空表、判断表是否为空、查询表中数据元素个数、查询第i个数据元素的值、插入数据元素、删除数据元素等
有序线性表的合并时,比较两表头部元素的大小,交替放入新的线性表中,最后可能有一个表中有剩余,将其依次放入新表中即可。时间复杂度为$ O(LenA+LenB) LenA LenB$为两表的长度
线性表的具体实现
顺序存储
顺序存储就是用一组地址连续的存储单元依次存储线性表的数据元素,这种存储方法称为线性表的顺序存储结构/顺序映像。对于顺序存储的线性表,只要知道了线性表的起始位置,其中的任一数据元素均可随机存取。
显然,一个线性表的第i个元素$ a_i Loc(a_1)+(i-1)*l Loc(a_1) l$为每个数据元素占用的存储单元大小
但是,对于顺序存储的线性表,由于逻辑上相邻的元素在物理位置上也是相邻的,除了要在线性表的最后插入一个数据元素外,在其余位置插入数据元素都必须移动元素。在顺序存储的线性表中插入或删除一个数据元素,平均约要移动表中的一半元素
链式存储
链式存储是用一组任意存储单元来存储线性表的数据元素(可以不连续),即逻辑上相邻的在物理位置上不一定相邻。这种存储结构为非顺序映像/链式映像虽然可以快速插入和删除元素,但不能随机存取
对于链式存储的线性表中的每个元素,不仅存储其本身的信息(数据域),还要存储一个指向其直接后继的信息(指针域)。数据域和指针域共同构成结点。多个结点链接为一个链表
每个结点只包含一个指针域,称为线性链表/单链表。头指针指示链表中第一个结点的存储位置;最后一个结点的指针域的指针为空。在线性链表中,数据元素之间的逻辑关系由结点中的指针指示,指针为数据元素之间逻辑关系的映像
在插入或删除第i个结点时,都必须经过前i-1个结点进行索引
静态链表
使用一维数组来描述线性链表,不设高级程序语言中的指针,用数组的下标来代替指针的功能。可以将数组下标为0的视为“头结点”,在其他结点的指针域中,用0表示“空指针”
事实上,静态链表所使用的数组中,含有两个链表,分别用作存储已经使用的结点和空闲的备用结点。
循环链表
线性表中最后一个结点的指针域指向头结点。判断线性表是否为空时,需要通过指针域是否指向头结点来判断
双向链表
双向链表中的结点有两个指针域,一个指向直接后继,一个指向直接前驱。显然,双向链表也可以设计为首尾相接的。双向链表在插入和删除时,要注意指针的修改
链式存储应用于一元多项式
可以很好地解决只有高次项时,顺序存储造成的空间浪费问题。使用有序的链式存储线性表可以用于一元多项式的表示和实现。为了优化运算时需要的空间,表示计算结果链表中的结点可以从参与运算的多项式上“摘取”
两个一元多项式相加、相减的算法与有序线性表合并类似;两个一元多项式相乘,可以分解为一系列加法,通过相加的算法实现
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)