【数据结构】数据结构知识点整理-第二章-线性表

在这里插入图片描述

2.1 线性表的定义和基本操作

2.1.1 线性表的定义

线性表是具有相同数据类型的n(n≥0)个数据元素的有限序列,其中n为表长,当n=0时线性表是一个空表。若用L命名线性表,则其一般表示为L=(a_1,a_2,…,a_i,a_(i+1),…,a_n )。式中,a_1是唯一的“第一个”数据元素,又称表头元素;a_n是唯一的“最后一个”数据元素,又称表尾元素。除第一个元素外,每个元素有且仅有一个直接前驱。除最后一个元素外,每个元素有且仅有一个直接后继。以上就是线性表的逻辑特性,这种线性有序的逻辑结构正是线性表名字的由来。

由此,我们得出线性表的特点如下

  • 表中元素的个数有限。
  • 表中元素具有逻辑上的顺序性,表中元素有其先后次序。
  • 表中元素都是数据元素,每个元素都是单个元素。
  • 表中元素的数据类型都相同,这意味着每个元素占有相同大小的存储空间。
  • 表中元素具有抽象性,即仅讨论元素间的逻辑关系,而不考虑元素究竟表示什么内容。

2.1.2 线性表的基本操作

数据的逻辑结构

一个数据结构的基本操作是指其最核心、最基本的操作。其他较复杂的操作可通过调用其基本操作来实现。线性表的主要操作如下:

  • InitList(&L)//初始化表。构造一个空的线性表。
  • Length(L)//求表长。返回线性表L的长度,即L中数据元素的个数。
  • LocateElem(L,e)//按值查找操作。在表L中查找具有给定关键字值的元素。
  • GetElem(L,i)//按位查找操作。获取表L中第i个位置的元素的值。
  • ListInsert(&L,i,e)//插入操作。在表L中的第i个位置上插入指定元素e。
  • ListDelete(&L,i,&e)//删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值。
  • PrintList(L)//输出操作。按前后顺序输出线性表的所有元素值。
  • Empty(L)//判空操作。若L为空表,则返回true,否则返回false。
  • DestroyList(&L)//销毁操作。销毁线性表,并释放线性表L所占用的内存空间。

2.2 线性表的顺序表示

2.2.1 顺序表的定义

1. 顺序表的定义

顺序表——用顺序存储的方式实现线性表。顺序存储,把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。线性表是具有相同数据类型的n(n≥0)个数据元素的有限序列

2. 顺序表的实现

  • 静态分配:静态分配一定的数据空间
  • 动态分配:定义一个指针,存储maloc的返回起始指针
  • 顺序表的特点:
    • 随机访问,可以在O(1)时间内找到第i个元素。
    • 存储密度高,每个节点只存储数据元素
    • 拓展容量不方便(即便采用动态分配的方式实现,拓展长度的时间复杂度也比较高)
    • 插入、删除操作不方便,需要移动大量元素

2.2.2 算法效率的度量

1. 插入操作

ListInsert(&L,i,e)//插入操作。在表L中的第i个位置上插入指定元素e。

  • 最好时间复杂度O(1)
  • 最坏时间复杂度O(n)
  • 平均时间复杂度O(n)

2. 删除操作

ListDelete(&L,i,&e)//删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值。

  • 最好时间复杂度O(1)
  • 最坏时间复杂度O(n)
  • 平均时间复杂度O(n)

3. 按位查找(顺序查找)

GetElem(L,i)//按位查找操作。获取表L中第i个位置的元素的值。

  • 时间复杂度O(1)

4. 按值查找(顺序查找)

LocateElem(L,e)//按值查找操作。在表L中查找具有给定关键字值的元素。

  • 最好时间复杂度O(1)
  • 最坏时间复杂度O(n)
  • 平均时间复杂度O(n)

2.3 线性表的链式表示

2.3.1 单链表的定义

线性表的链式存储又称单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素。为了建立数据元素之间的线性关系,对每个链表结点,除存放元素自身的信息外,还需要存放一个指向其后继的指针。

  • 不带头结点的单链表
  • 带头结点的单链表

2.3.2 单链表上的基本操作的实现

  • 不带头结点的单链表
    • 插入:平均时间复杂度O(n)
      ListInsert(&L,i,e)//插入操作。在表L中的第i个位置上插入指定元素e。
    • 删除:平均时间复杂度O(n)
      ListDelete(&L,i,&e)//删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值。
    • 查找(按位):平均时间复杂度O(n)
      GetElem(L,i)//按位查找操作。获取表L中第i个位置的元素的值。
    • 查找(按值):平均时间复杂度O(n)
      LocateElem(L,e)//按值查找操作。在表L中查找具有给定关键字值的元素。
    • 求表长:平均时间复杂度O(n)
      Length(L)//求表长。返回线性表L的长度,即L中数据元素的个数。
  • 带头结点的单链表
    • 插入:平均时间复杂度O(n)
      ListInsert(&L,i,e)//插入操作。在表L中的第i个位置上插入指定元素e。
    • 删除:平均时间复杂度O(n)
      ListDelete(&L,i,&e)//删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值。
    • 查找(按位):平均时间复杂度O(n)
      GetElem(L,i)//按位查找操作。获取表L中第i个位置的元素的值。
    • 查找(按值):平均时间复杂度O(n)
      LocateElem(L,e)//按值查找操作。在表L中查找具有给定关键字值的元素。
    • 求表长:平均时间复杂度O(n)
      Length(L)//求表长。返回线性表L的长度,即L中数据元素的个数。
  • 单链表的建立
    • 尾插法:平均时间复杂度O(n)
    • 头插法

2.3.3 双链表

  • 双链表的初始化(带头结点)
  • 双链表的插入(注意是否是最后一个结点):平均时间复杂度O(n)
  • 双链表的删除(注意是否是最后一个结点):平均时间复杂度O(n)
  • 双链表的遍历:平均时间复杂度O(n)

2.3.4 循环链表

  • 循环单链表(判断为空:头结点是否指向自己;判断为循环单链表:尾结点是否指向头结点)
  • 循环双链表(表尾结点的next指针指向头结点,表头结点的prior指针指向表尾结点)

2.3.5 静态链表

  • 什么是静态链表:分配一整片连续的数据内存,各结点集中安置
  • 如何定义一个静态链表
    • 使用数组
    • 不使用数组
  • 简述基本操作的实现
    • 查找:从头结点出发挨个往后遍历结点:平均时间复杂度O(n)
    • 插入(按位插入)

2.3.6 顺序表和链表的比较

顺序表链表
逻辑结构都属于线性表,都是线性结构都属于线性表,都是线性结构
存储结构优点:支持随机存取、存储密度高 缺点:大片连续空间分配不方便,改变容量不方便优点:离散的小空间分配方便,改变容量方便 缺点:不可随机存取,存储密度低
基本操作顺序表链表
需要预分配大片连续空间。若分配空间过小则之后不方便拓展容量;若分配空间过大,则浪费内存资源只需分配一个头结点(也可以不要头结点,只声明一个头指针),之后方便拓展
静态分配(系统自动回收),动态分配(free)依次删除各个结点(free)
增/删后续元素都前移/后移:O(n)增/删:修改指针:O(n)
按位/值查找:O(1)/O(n)按位/值查找:O(n)/O(n)
  • 表长难以估计、经常要增加/删除元素——链表
  • 表长可预估计、查找(搜索)操作较多——顺序表
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

敲代码两年半的练习生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值