数据结构学习笔记之广义表(java)

广义表

定义和性质

线性表是由 n 个元素组成的有限序列。其中每个组成元素被限定为单元素。

广义表(Generalized Lists)是 n(n >= 0) 个数据元素的有序序列,一般记作:

ls = (a1, a2, …, an);

其中 ai 可以是单个元素,也可以是一个广义表,分别称为广义表的 ls 的单元素和子表,当广义表为非空时,称第一个元素 a1 为 ls 的表头(head),称其余元素组成的表为 ls 的表尾(Tail)。广义表的定义是递归的。

性质:

  • 广义表是一种多层次的数据结构,广义表的元素可以是单元素也可以是子表,而子表的元素还可以是子表。
  • 广义表可以是递归的表。即广义表可以是自身的子表。
  • 广义表可以为其他表所共享。

例如:

  1. A = ()
  2. B = (e)
  3. C = (a, (b, c, d))
  4. D = (A, B, C)
  5. E = (a, E)
  6. F = (a, (b, c), ((a, b), c))

当二维数组的每行(每列)作为子表来处理时,二维数组即为一个广义表。广义表的机构很灵活,它可以兼容线性表、数组、树和有向图等常用的数据结构。

广义表的长度和深度:

广义表长度时广义表中元素的个数。如 lenggh(B) = 1, length(D) = 3。广义表的深度是广义表展开后所含括号的最大层数,如 depth(F) = 3, depth(E) = ∞ 。

广义表的基本运算有: 建立、插入、删除、拆开、连接、复制、遍历等。

存储结构

单链表存储

  • 单链表的节点有三个域: 标识域(标识是否为原子数据或子表)、数据域、指针域

双链表存储

  • 双链表节点: 数据域、子表指针域、后继指针域。