数据结构与算法##2.线性表

数据结构与算法##2.线性表


一、什么是线性表

简称表,有穷序列(包括空表)
表目(元素)、索引(下标)、表的长度
特点:操作灵活,长度可变

1.结构和特点

B=(K,R) ; K={a0,a1,…,an-1} R={r}
开始节点 无钱去
结束节点 无后继
其他内部节点都有唯一的的直接前驱和后继 <ai,ai+1>
r为前驱和后继关系,具有反对称性和传递性

特点:

  • 均匀性:同一线性表的各数据元素必定具有相同的数据类型和长度
  • 有序性:各元素之间的相对位置是线性的

2.分类

按复杂程度

  • 简单的:线性表、栈、队列、散列表
  • 高级的:广义表、多维数组、文件

按访问方式

  • 直接访问型
  • 顺序访问型
  • 目录索引型

按操作

  • 线性表(按存储结构分顺序表,链表) 不限制操作
  • 栈LIFO 在同一端操作
  • 队列FIFO 在两端操作

3.线性表的运算

  • 建立线性表
  • 清除线性表
  • 插入一个新元素
  • 删除某个元素
  • 修改某个元素
  • 排序
  • 检索

二、顺序表

向量,定长的一维数组存储结构
特性:

  • 元素类型相同shuxu
  • 元素顺序地存储在连续存储空间中,每一个元素都有唯一的索引值
  • 使用常数作为向量长度

数组存储
读写元素很方便,通过下标定位,通过首地址进行随机存取
Li=L0+c*i,c为元素的地址空间大小

顺序表删除:后面的挨个往前移 O(n)

三、链表

存储节点=数据域+指针域(后继地址)
分类:单链、双链、循环链
单链表:简单的单链表、带头结点的单链表
对一个结点操作,必先找到它,即用一个指针指向它
找单链表中任一结点,都必须从第一个点开始
定位:O(n)
插入:O(n)+O(1)
删除:O(n)+O(1)

双链表:增加一个指向前驱的指针
循环链表:头尾节点链接起来,从循环表中任一结点出发,都能访问到表中其他节点

链表的边界条件:

几个特殊点的处理

  • 头指针的处理
  • 非循环链表尾结点的指针域保持为NULL
  • 循环链表结点的指针回指头结点

链表处理

  • 空链表的特殊处理
  • 插入或删除结点时指针勾链的顺序
  • 指针移动的正确性

四、顺序表和链表的比较

顺序表:

  • 没有使用指针,不用花费额外花销
  • 线性表元素的读访问非常简洁便利
  • 插入、删除运算时间代价O(n),查找则可常数时间完成
  • 如果整个数组元素很满,则没有结构性存储开销

链表:

  • 无需事先了解线性表的长度
  • 允许线性表的长度动态变化
  • 能够适应经常插入删除内部元素的情况
  • 插入、删除运算时间代价O(1),但找第i个元素运算时间代价O(n)
  • 存储利用指针,动态地按照需要为表中新的元素分配存储空间
  • 每个元素都有结构性存储开销

顺序表时存储静态数据地不二选择
链表是存储动态变化数据的良方

存储密度
空间需求:顺序表DE 链表n(P+E)
临界值 n>DE/(P+E)

顺序表不适用:

  • 经常插入删除时,不宜使用顺序表
  • 线性表的最大长度也是一个重要因素

链表不适用:

  • 读操作比插入删除操作频率大,不应选择链表
  • 当指针的存储开销和整个结点内容所占空间相比其比例较大时

选择顺序表:

  • 结点总数目大概可以估计
  • 线性表中结点比较稳定(插入删除少)
  • n>DE/(P+E)

选择链表:

  • 结点数目无法预知
  • 线性表中结点动态变化(插入删除多)
  • n<DE/(P+E)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值