数据结构——2.1线性表及其实现

一、引言

线性结构是数据结构里面最基础最简单的一种数据结构类型,最典型的一种叫做线性表
举个例子:
如何用程序设计语言来表示这样的一个一元多项式及其相应的操作运算呢?
在这里插入图片描述

  1. 顺序存储结构直接表示
    用一个数组存储第i项的系数ai,而指数对应这个分量的下标
    在这里插入图片描述
    这样带来的问题是什么呢?假如我要表示x的两千次方,数组的大小就需要2001项,而其中很多都是含有0的项,这样就造成了存储空间的浪费
    而且在做加法的时候,需要把数组做一个循环,需要从0开始加到2000,实际上很多计算都是在加一些无效的0
  2. 顺序存储结构表示非零项
    将多项式看成是一个(ai, i)二元组的集合,这样,每一个分量就不单单只包含系数了,还包含了指数
    这里要注意的是:
    按指数的大小进行排列,在做加法的时候就能够达到比较快的运算速度
  3. 用链表结构来存储非零项
    链表中的每个结点存储多项式中的一个非零项,包括系数和指数两个数据域一个指针域
    在这里插入图片描述

在这里插入图片描述
在做加法运算的时候,就和2中两个数组的运算是一样的:
分别指向多项式的头,然后比较指数大小,大的输出,相等的系数相加

总结

  • 用数组实现有两种方法:一个是直接表示,另一个是只表示非零项 还有就是可以用链表实现
  • 同一个问题可以有不同的表示(存储)方法

二、线性表的概念

  1. 线性表:
  • 表中元素的个数称为线性表的长度
  • 线性表没有元素时,称为空表
  • 表的起始位置称为表头,表的结束位置称为表尾
  1. 线性表的抽象数据类型描述
  • 数据对象集:是由N的元素构成的有序序列
  • 操作集:
    在这里插入图片描述

三、 线性表的顺序存储实现

思想:利用数组的连续存储空间顺序存放线性表的各个元素
在这里插入图片描述

  • Tips:
  • 下标从0开始,一直到MAXSIZE - 1
  • 用Last来指示在这个数组里面存放的线性表最后一个元素an所在的位置
    这样就可以构成一个结构,这个结构就可以抽象地实现一个线性表,这样我们可以定义两个变量:L和ptr_L
    在这里插入图片描述
  • 访问下标为i的元素:L.Data[i]或者ptr_L->Data[i]
  • 线性表的长度:由于Last指示在这个数组里面存放的线性表最后一个元素an所在的位置,所以要+1,即L.Last+1或者ptr_L->Last+1

四、线性表主要操作的实现(顺序存储)

  1. 初始化(建立空表)
    在这里插入图片描述
  • 前面提到表示包含了一个数组和指向它最后一个位置的Last来表示的。
  • 首先我们就需要去申请这样的一个结构malloc函数返回void类型,强制转换为List,这里的List其实就是LNode
  • 把结构的Last成员设为-1,因为Last指向最后一个元素,如果Last为0就代表这个表里已经有一个元素了
  • 返回这个结构的指针
  1. 查找
    在这里插入图片描述
  • 传入的参数是ElementTypy类型的x,代表要在线性表L中找出的值,而链表是通过一个List ptrL指针来传入
  • i为下标,要小于等于Last指向的最后一个元素的位置
  • 通过下标i来访问线性表中的每一个元素,判断它是否等于x
  • 如果i大于了Last指向的最后一个位置,则说明没有找到,否则返回找到x时存储的位置。
  • 这样一种查找方法,查找成功的平均比较次数为(n+1)/2,**运气好第一个找到,运气不好最后一个才找到,平均就是(n+1)/2,**平均时间性能为O(n)
  1. 插入(在第i(1<= i <= n+1)个位置上插入一个值为x的新元素)
  • i=1就表示插入在这个线性表的头上
  • i=n+1就表示插入在这个线性表的最末尾
  • 对应的数组下标就是0到n
    在这里插入图片描述
  • 线性表是在数组里表示的,下标从0开始,所以实际上就意味着我们要把元素x放在i-1的位置上
  • 所以我们首先要做的事情就是把原来数组中i-1以后的元素,全部往后挪一位,腾出i-1的位置出来
    在这里插入图片描述
  • 要在第i个位置插入元素,说明这个线性表至少有一个位置是空的,否则是线性表是满的,无法插入
  • 这里的i代表的是我们通常说的第1个位置、第二个位置。。。和最后一个位置(此时Last后应还有一个空位),于是,若i<1 || i>ptrL->Last + 2时,是不能插入的
  • 在挪动元素的时候,要把元素从后往前挪,否则会出现分量Data[i-1]到Data[Ptrl->Last+1]都是同一个值,即移之前Data[i-1]的值
  • 最后,记得将元素插入下标为i-1的地方,并把Last指向后一位
  1. 删除(删除表的第i(1<= i <=n)个位置上的元素)
  • 对应数组的下标是0到n-1
    在这里插入图片描述
    在这里插入图片描述

五、线性表的链式存储实现

  • 不要求逻辑上相邻的两个元素物理上也相邻;通过“链”建立起数据元素之间的逻辑关系。
  • 插入和删除不需要移动数据元素,只需要修改“链”
    在这里插入图片描述
    在这里插入图片描述
  • Next代表了下一个结点的位置
  1. 求表长
    在这里插入图片描述
  • 注意j从0开始
  1. 查找
  • 1)按序号查找
    在这里插入图片描述
  • 2)按值查找
    在这里插入图片描述
  1. 插入(在第i-1(1<= i <=n+1)个结点后插入一个值为x的新结点)
  • 在插入的时候,一定要知道前面的一个结点是谁,这样才能把这个结点接上去
  • 1)先构造一个新的结点,用s指向它
  • 2)再找到链表的第i-1个结点,用p指向它
  • 3)然后修改指针,插入结点(p之后插入新结点是s)
    在这里插入图片描述
  • 那么这里有个问题,如果1和2的顺序对调一下,会发生什么呢?答案就是s->Next指向s,从而不能正确完成插入

在这里插入图片描述

  1. 删除(删除链表的第i(1<= i <=n)个位置上的结点)
  • 1)先找到链表的第i-1个结点,用p指向
  • 2)再用指针s指向要被删除的结点(p的下一个结点)
  • 3)修改指针,删除s所指的结点
  • 4)释放s所指结点的空间 在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

六、广义表

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/CSDN_dzh/article/details/83412566