关于线性表的结构整理

线性表

(线性表从“1”开始)

  • 定义:List,由零个或多个数据元素组成的有限序列。具有线一样性质的结构,像排队一样。

    • 是序列,元素之间有先来后到的关系
    • 多个元素时,第一个无前驱,最后一个无后继,其他元素有且只有一个前驱和后继
    • 线性表强调是有限的
    • 线性表元素的个数n定义为线性表的长度,n=0时称为空表
  • 数据类型:一组性质相同的值的集合及定义在此集合上的一些操作的总称(整型,浮点型)

    • 原子类型:不可再分的基本类型(整型、浮点型)
    • 结构类型:若干个类型组合而成,可再分解(整型数组,是由若干整型数据组成的)
  • 抽象:抽取出事物具有的普遍性的本质。对已有的数据类型进行抽象,就有了抽象数据类型。在于其数学抽象特性。

  • 抽象数据类型:一个数学模型及定义在该模型上的一组操作。取决于它的一组逻辑特性。(把数据类型和相关操作捆绑在一起)

  • 操作:

    • InitList(*L):初始化操作,建立在一个空的线性表上
    • ListEmpty(L):判断线性表是否为空表,若为空返回True,否则返回False
    • ClearList(*L):将线性表清空
    • GetElem(L,i,e*):将线性表L中的第i个位置元素值返回给e
    • LocateElem(L,e):在线性表L中查找与给定值e相等的元素;查找成功,返回该元素在表中的序号;否则返回0表示失败
    • ListInsert(*L,i,e):在线性表中第i个位置插入元素e
    • ListDelete(*L,i,*e):删除线性表L中第i个位置的元素,并用e返回其值
    • ListLength(L):返回线性表L的元素个数

线性表的顺序存储结构

(更适合存取)

  • 定义:用一段地址连续的存储单元依次存储线性表的数据元素(被占用,但可空着)
#define MAXSIZE 20
typedef int ElemType;
typedef struct
{
    ElemType data[MAXSIZE];
    int length; //线性表当前长度
}SqList;
  • 三个属性:
    • 存储空间的起始位置,数组data,它的存储位置就是线性表存储空间的存储位置
    • 线性表的最大存储容量:数组长度MaxSize
    • 线性表的当前长度:length
  • 地址计算方法:
    LOC(ai)=LOC(a1)+(i-1)*c 它的存储时间性能为o(1),我们通常称为随机存储结构
  • 线性表的顺序存储结构,在存、读数据时,不论那个位置,时间复杂度都是o(1),插入或删除时,为o(n
  • 优点:无须为了逻辑关系而增加额外存储空间
  • 缺点:
    • 插入删除需移动大量元素
    • 线性表长度变化较大时,难以确定存储空间的容量
    • 容易造成存储空间的“碎片”(小块空间)

线性表的链式存储结构

  • 特点:
    • 用一组任意的存储单元存储线性表的数据元素,这组存储单元可以存在内存中未被占用的任意位置
    • 除了要存储数据元素信息外,还要存储它的后继元素的存储地址(指针)
    • 数据域:存储数据元素信息的域
    • 指针域:存储直接后继位置的域
    • 指针/链:指针域中存储的信息
    • 存储映像/结点:数据域和指针域中信息组成的数据元素
    • 链式存储结构:n个结点链接成一个链表,即为线性表的…
    • 单链表:每个结点中只包含一个指针域
    • 头指针:指向头结点的指针。头结点的数据域一般不存储任何信息。常用头指针冠以链表的名字。头指针均不为空。头指针是链表的必要元素
    • 头结点:为了操作的统一和方便而设立,放在第一个元素的结点之前,其数据域一般无意义(也可存放链表的长度)。不一定是链表的必须元素

      空链表为:头指针->头结点->NULL
      C语言中可以用结构指针来描述单链表
typedef struct Node
{
    ElemType data;      //数据域
    struct Node *Next   //指针域
}Node;
typedef struct Node *LinkList;
  • 单链表遍历读取:时间复杂度为o(n),核心思想为“工作指针后移”

  • 单链表第i个数据插入结点的算法

    1. 声明一结点p指向链表头结点,初始化j从1开始
    2. j<1时,遍历链表,查找到第i个元素,查找成功后生成一个空结点
    3. 改变链表中指针的指向
  • 单链表的删除:把a1的指针指向a3,即前继结点指针绕过指向后继结点,记得释放内存

    p->next = p->next->next;
    

    对于插入或删除数据越频繁的操作,单链表的效率优势就越明显

  • 单链表的整体创建:

    • 顺序存储:类似数组的初始化
    • 单链表:动态生成,灵活应变
      1. 声明一结点p和计数器变量i
      2. 初始化一空链表L
      3. 让L的头结点指针指向NULL,建立一个带头结点的单链表
      4. 循环实现后继结点的赋值和插入
    • 头插法:把新加进的元素放在表头后的第一个位置
      1. 先让新结点的next指向头结点之后(如NULL)
      2. 表头的next指向新结点
    • 尾插法:新结点都加入到最后(建立一个标记r指针,一直后移)
  • 单链表的整表删除:

    • 声明结点p和q
    • 第一个结点赋值给p,下一个结点给q
    • 循环执行释放p和将q赋值给p的操作
    • 注:不可单独循环用p,释放结点时指针域也被释放,此时p的指向不确定
  • 结构的选择:线性表需要频繁查找,很少插入删除时采用顺序存储结构,频繁插入删除时用单链表

静态链表
  • 定义:用数组描述的链表叫做静态链表,这种描述方法叫做游标实现法
    • 我们对数组的第一个和最后一个元素做特殊处理,data不存放任何数据
    • 我们通常把未使用的数组元素称为备用链表
    • 数组的第一个元素,即下标为0的那个元素的cur就存放备用链表的第一个结点的下标
    • 数组的最后一个元素,即下标为MAXSIZE-1的cur则存放第一个有数值的元素的下标,相当于单链表的头结点的作用
    • 数组的最后一个元素游标是0,指向第一个元素,第一个元素再指向备用链表的第一个元素
    • 总体来讲:下标相当于元素的地址,游标相当于指向下一个地址的指针
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值