线性表的定义

由n(n≥0)个数据元素(节点)a1,a2,...an组成的有限序列。该序列中的所有节点具有相同的数据类型。其中数据元素的个数n称为线性表的长度。
当n=0时,称为空表。
当n>0时,将非空的线性表记作:a1,a2,...,an,a1称为线性表的第一个(首)节点,an称为线性表的最后一个(尾)节点。
a1,a2,...ai1都是ai2in前驱,其中ai1ai直接前驱ai+1ai+2...an都是ai1in1后继,其中ai+1ai直接后继

线性表的抽象数据类型

ADT List{
数据对象:D={ai|aiElemSet,i=1,...,n,n0}
数据关系:R={<ai1,ai>|ai1,aiD,i=2,3,...n}
基本操作:
InitList(&L)
操作结果:构造一个空的线性表L;
ListLength(L)
初始条件:线性表L已存在;
操作结果:若L为空表,则返回TRUE,否则返回FALSE;
……
GetEleme(L,i,&e)
初始条件:线性表L已存在,1≤i≤ListLength(L);
操作结果:用e返回L中第i个数据元素的值;
ListInsert(L,i,&e)
初始条件:线性表L已存在,1≤i≤ListLength(L);
操作结果:在线性表L中的第i个位置插入元素e;
……
}ADT List

线性表的顺序存储

  • 存储结构

    顺序存储:把线性表的节点按逻辑顺序依次存放在一组地址连续的存储单元里。用这种方法存储的线性表简称顺序表。
    顺序存储 的线性表的特点
    1)线性表的逻辑顺序与物理顺序一致;
    2)数据元素之间的关系是以元素在计算机内“物理位置相邻”来体现。

  • 基本操作

    • 初始化
      第2章 线性表
    • 插入

      在线性表L=(a1,...,ai1,ai,ai+1,...,an)中的第i(1≤i≤n)个位置上插入一个新节点e,使其成为线性表:
      L=(a1,...,ai1,e,ai,ai+1,...,an)
      实现步骤:
      (1)将线性表L中的第i个至第n个节点后移一个位置
      (2)将节点e插入到节点ai1之后
      (3)线性表长度加1
      第2章 线性表

    • 删除

      在线性表L=(a1,...,ai1,ai,ai+1,...,an)中删除节点ai(1≤i≤n),使其成为线性表:L=(a1,...,ai1,ai+1,...,an)
      实现步骤:
      (1)将线性表L中的第i+1个至第n个节点依次向前移动一个位置
      (2)线性表长度减1
      第2章 线性表

线性表的链式存储

  • 存储结构

    用一组任意的存储单元存储线性表中的数据元素。用这种方法存储的线性表简称线性链表
    存储链表中节点的一组任意的存储单元可以是连续的,也可以是不连续的,甚至是零散分布在内存中的任意位置上的。
    链表中节点的逻辑顺序和物理顺序不一定相同。
    链表是通过每个节点的指针域将线性表的n个节点按其逻辑次序链接在一起的。

  • 基本操作

1.建立单链表

头插法
第2章 线性表
尾插法
第2章 线性表

2.单链表查找

按序号查找
第2章 线性表
按值查找
第2章 线性表

3.单链表插入

第2章 线性表

4.单链表删除

按序号删除
第2章 线性表
按值删除
第2章 线性表

5.单链表合并

第2章 线性表

双向链表

  • 存储结构

双向链表指的是构成链表的每个节点中设立两个指针域:一个指向其直接前驱的指针域prior,一个指向其直接后继的指针域next。这样形成的链表中有两个方向不同的链,故称为双向链表
第2章 线性表


  • 基本操作

双向链表插入
第2章 线性表
双向链表删除
第2章 线性表
注意:与单链表的插入和删除操作不同的是,在双向链表中插入和删除必须同时修改两个方向上的指针域的指向。

相关文章:

  • 2021-12-24
  • 2022-12-23
  • 2021-04-08
  • 2021-12-15
  • 2022-12-23
  • 2021-07-10
  • 2021-05-16
  • 2022-12-23
猜你喜欢
  • 2021-05-18
  • 2021-05-02
  • 2021-06-29
  • 2021-10-01
  • 2021-12-19
  • 2022-12-23
  • 2021-05-21
相关资源
相似解决方案