【数据结构】· 线性表(上)

写在前面


        Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正!谢谢大家!!!

        如果小哥哥小姐姐们对我的文章感兴趣,请不要吝啬你们的小手,多多点赞加关注呀!❤❤❤ 爱你们!!!

1a270aae4ed3472db058856ab2829027.gif


目录

写在前面

1. 线性表的定义和特点

1.1线性表

1.2 线性表的逻辑特征

 2. 案例引入

2.1 案例1:一元多项式的运算

2.2 案例2:系数多项式的运算

2.3 案例3:图书管理系统

2.4 总结

3. 线性表的类型定义

3.1 抽象数据类型线性表的定义

4. 线性表的顺序表示和实现

4.1 线性表的顺序存储表示

4.2 顺序表基本操作的实现

4.3 顺序表小结

结语


【往期回顾】

【数据结构】· 前章 · 绪论


1. 线性表的定义和特点


1.1线性表

  • 线性表是具有相同特性的数据元素的一个有限序列。

0b32d033b70e41b58eeccdd29c4aecbf.png

  •  线性表是是由n(n≥0)个数据元素(结点),a1,a2……an组成的有限序列
    • 其中数据元素的个数n定义为表的长度。
    • 当n=0是成为空表。
    • 将非空的线性表(n>0)记作(a1,a2……an)
    • 这里的数据元素ai(1≤i≤n)只是一个符号的抽象,其具体含义在不同的情况下可以不同。

1.2 线性表的逻辑特征

  • 在非空的线性表,有且仅有一个开始结点a1,它没有没有直接前趋,而只有一个直接后继a2
    • 其余的内部结点ai(2≤i≤n-1)都有且仅有一个直接前趋ai-1和一个直接后继ai+1
    • 有且仅有一个终端节点an,它没有直接后继,而仅有一个直接前趋an-1
  • 线性表是一种典型的线性结构

a3b38f210a304bf391c697d680fc1cd4.png

 2. 案例引入


2.1 案例1:一元多项式的运算

实现两个多项式加、减、乘运算:

24007acd241849ddbdfdc3034ccedf0d.png

8d7eba7045774dbd9382a17e83d5bc73.png


2.2 案例2:系数多项式的运算

861b0a19b5c244aaaff7c2a83bd2e26e.png

  • 创建一个新数组C 
  • 分别从头遍历比较a和b中的每一项
    • 指数相同:对应系数相加,若其和不为零,则在C中增加一个新项
    • 指数不相同:则将指数较小的项复制到C中
  • 一个多项式已遍历完毕时,将另一个剩余项依次复制到C中即可

  • 顺序存储结构的问题:
    • 存储空间分配不灵活
    • 运算的空间复杂度高

2.3 案例3:图书管理系统

d5f4989fb729429ca2bdc9854be0b378.png

  • 需要的功能: 查找、插入、删除、修改、排序、计数
  • 图书表抽象为线性表
  • 表中每本图书抽象为线性表中的数据元素

17e66c1d1e6044fb9854f84e27180c17.png

d5020b4cedb5439a9b53537d38a46a92.png


2.4 总结

  • 线性表中数据元素的类型可以为简单类型,也可以为复杂类型
  • 许多实际应用问题所涉及的基本操作有很大相似性,不应为每个具体应用单独编写一个程序
  • 从具体应用中抽象出共性的逻辑结构和基本操作(抽象数据类型),然后实现其存储结构和基本操作

a3b38f210a304bf391c697d680fc1cd4.png

3. 线性表的类型定义


3.1 抽象数据类型线性表的定义

1fceebf9540d4fe9b085941b171a223a.png

ab491d2d83cb48ae87f438ae3fb97890.png


a3b38f210a304bf391c697d680fc1cd4.png

4. 线性表的顺序表示和实现


4.1 线性表的顺序存储表示

  • 线性表的顺序存储表示又称为顺序存储结构顺序映像
  • 顺序存储定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。即逻辑上相邻,物理上也相邻。
  • 例如线性表(1,2,3,4,5,6)的存储结构
    123456
  • 依次存储,地址连续----中间没有空出存储单元。这是一个典型的线性表顺序存储结构。
123456
  • 地址不连续----中间存在空的存储单元。着不是一个线性表顺序存储结构。
  • 线性表顺序存储结构占用一片连续的存储空间。知道某个元素的存储位置就可以计算其他元素的存储位置。

线性表中元素存储位置的计算:

  • 如果每个元素占用8个存储单元,ai存储位置是2000单元,则ai+1的存储位置是2008单元。
  • 假设线性表的每个元素需占L个存储单元,则第i+1个数据元素的存储位置和第i个数据元素的存储位置之间满足关系:
  • 由此,所有数据元素的存储位置均可由第一个元素的存储位置得到:

  • 线性表顺序存储结构的图示:

  • 顺醋表的特点:以物理位置相邻表示逻辑关系,任一元素均可随机存取。(优点)

多项式的顺序存储结构类型定义:

顺序表示意图:


4.2 顺序表基本操作的实现

  • 算法一:线性表L的初始化(参数用引用)

  •  补充几个简单的操作:
  • 一:摧毁线性表L:

  •  二:清空线性表L:

  • 三:求线性表L的长度:

  • 四:判断线性表L是否为空:

 


  • 算法二:顺序表的取值(根据位置i获取相应位置数据元素的内容)


  • 算法三:顺序表的查找(按值查找)
  • 例如:在图书表中,按照给定书号进行查找,确定是否存在该图书。如果存在,输出是第几个元素;如果不存在,输出0

  1. 在线性表L中查找与指定值e相同的数据元素的位置。
  2. 从表的一端开始,逐个进行记录的关键字和给定值的比较。找到,返回该元素的位置序号;未找到,返回0。

  • 顺序表的查找算法分析:
  • 因为查找算法的基本操作为:将记录的关键字同给定值进行比较。
  • 基本操作:L.elem[i]==e

  • 平均查找长度ASL:为确定记录在表中的位置,需要与给定值进行比较的关键字的个数的期望值叫做查找算法的平均查找长度。

 


  • 算法四:顺序表的插入

  • 线性表的插入运算是指在表的第i(1≤i≤n+1) 个位置上,插入一个新结点e,使长度为n的线性表变成长度为n+1的线性表。
  • 算法思想:
  1. 判断插入位置i是否合法。
  2. 判断顺序表的存储空间是否已满,若已满,返回ERROR。
  3. 将第n至第i位的元素一次向后移动一个位置,空出第i个位置。
  4. 将要插入的新元素e放入第i个位置。
  5. 表长加1,插入成功返回OK。

顺序表的插入算法分析: 

  • 算法时间主要消耗在移动元素的操作上。
    • 若插入在尾结点之后,则根本无需移动(特别快)。
    • 若插入在首结点之前,则表中元素全部后移(特别慢)。

若要考虑在各种位置插入(共n+1种可能)的平均移动次数,该如何计算?

  •  顺序表插入算法的平均时间复杂度为O(n)。

  • 算法五:顺序表的删除

  • 线性表的删除运算是指将表的第i(1≤i≤n+1) 个元素删除 ,使长度为n的线性表变成长度为n-1的线性表
  • 算法思想:
  1. 判断插入位置i是否合法。(合法值为1≤i≤n
  2. 将欲删除的元素保留在e中。
  3. 将第i+1至第n位的元素依次向前移动一个位置。
  4. 表长减1,删除成功返回OK。

顺序表的删除算法分析: 

  • 算法时间主要消耗在移动元素的操作上。
    • 若删除尾结点,则根本无需移动(特别快)。
    • 若删除首结点,则表中n-1个元素全部前移(特别慢)。

若要考虑在各种位置删除(共n种可能)的平均移动次数,该如何计算?

  •  顺序表删除算法的平均时间复杂度为O(n)。

4.3 顺序表小结

顺序表(线性表的顺序存储结构)的特点:

  1. 利用数据元素的存储位置表示线性表中相邻数据元素之间的前后关系,即线性表的逻辑结构与存储结构一致。
  2. 在访问线性表时,可以快速的计算出任何一个数据元素的存储地址。因此可以粗略的认为,访问每个元素所花时间相等。
  • 这种存取元素的方法称为随机存取法

时间复杂度:

  • 查找、插入、删除算法的平均时间复杂度为T(n)=O(n)。

空间复杂度:

  • 顺序表操作算法的空间复杂度S(n)=O(1)。(没有占用辅助空间)

线性表优缺点:

  • 优点:
    • 存储密度大。(结点本身所占存储量/结点结构所占存储量)
    • 可以随机存取表中任一元素。
  • 缺点:
    • 在插入、删除某一元素时,需要移动大量元素。
    • 浪费存储空间,
    • 属于静态存储形式,数据元素的个数不能自由扩充

a3b38f210a304bf391c697d680fc1cd4.png

结语


本人会持续更新文章的哦!希望大家一键三连,你们的鼓励就是作者不断更新的动力aa4e229fc4e940be803760dd99cc5ca5.png

c5cc55d7a0e9484082090157bab30d9c.gif

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

麟-小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值