1 一些概念

数据 = 数据元素 + 数据的结构(数据结构)

1.1 数据元素

构成数据的 基本单位 ,拿现实中来说:一个所有学生的数据中,学生就是数据元素。某所学校所有人员的数据中, 人员就是数据元素。

一个数据元素可以由其他多个数据元素构成 ,如一个学生由姓名,学号等等数据元素构成。

1.2 数据结构

结构,是指 事物自身各种要素之间的相互关联和相互作用的方式 ,包括构成事物要素的数量比例、排列次序、结合方式和因发展而引起的变化,这是事物的结构。

因此数据的结构就是数据元素之间的相互关联和相互作用的方式。

1.3 逻辑结构和物理结构

当设计一个数据结构时,我们首先紧会考虑它的逻辑结构,之后为了实现这种逻辑结构,我们需要考虑它在计算机中的物理存储方式。

因此,从逻辑或物理的角度可以对数据结构进行分类。

结构分类

1.3.1 逻辑结构

事物之间的关系可以分为:

  1. 无关系
  2. 一对一
  3. 一对多
  4. 多对多

因此,从这个角度逻辑结构分为:

  1. 集合结构 (无关系)
  2. 线型结构 (一对一)
  3. 树型结构 (一对多)
  4. 图型结构 (多对多)

1.3.2 物理结构

物理结构指计算机为了体现逻辑结构,物理上存储数据的方式。

物理结构分为:

  1. 顺序存储
  2. 链式存储

1.3.3 顺序存储

使用一段连续的存储空间来对数据进行存储。

1.3.4 链式存储

可以使用任意的存储空间对数据进行存储,但是会 存储额外的信息来体现他们之间的关系

2 线性表(线型结构)

2.1 顺序存储

使用一段连续的内存空间来存储线性结构。

2.1.1 优缺点

线性表顺序存储优缺点

2.2 链式存储

前面的 顺序结构优缺点 中已经可以看到其在 插入删除 时由于需要保持内存的连续性,带来了性能开销。 因此,引入链式存储。

2.2.1 定义

使用连续或连续的空间,保存数据本身,再使用额外的空间保存地址(用来维护相互间的关系)

2.2.2 节点结构

每个节点由两部分构成

  1. 存储数据的数据域
  2. 存储后继节点的地址域

节点结构

/* 单链表存储结构 */
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList;

2.2.3 性能

对链表的操作主要包括两部分,

  1. 查询到指定节点
  2. 插入或删除节点

查询节点的性能为O(n), 而插入或删除为O(1).

2.2.4 头指针

指向线性表中第一个节点的指针即为头指针。

单链表1

单链表2

  • 在线性表的链式存储结构中,头指针是指链表指向第一个结点的指针,若链表有头结点,则头指针就是指向链表头结点的指针。
  • 头指针具有标识作用,故常用头指针冠以链表的名字。
  • 无论链表是否为空,头指针均不为空。头指针是链表的必要元素。

2.2.5 头结点

出于统一操作逻辑,优化算法的目的,会在单链表的第一个结点(有效元素)之前附设一个结点,称之为头结点

  • 头结点是为了操作的统一与方便而设立的,放在第一个元素结点之前,其数据域一般无意义(当然有些情况下也可存放链表的长度、用做监视哨等等)。
  • 有了头结点后,对在第一个元素结点前插入结点和删除第一个结点,其操作与对其它结点的操作统一了。
  • 首元结点也就是第一个元素的结点,它是头结点后边的第一个结点。
  • 头结点不是链表所必需的。

2.2.6 总结

  1. 顺序

    顺序存储中这里的顺序指的是一个连续的内存空间,存储的数据并不一定是逻辑上有序的。

    比如:

    1 3 9 5 7 8 6 2 4 0

    这样的数据可以顺序存储,但是逻辑上并不是以由大到小或小到大的顺序。

  2. 性能

    通过上面的描述可以看到,线性表结构,要么是顺序表的 定位快速,插删慢速 ;要么是链表的 插删快速,定位慢速 。 而我们希望的是无论哪种操作都能拥有较好的性能。而其中的答案之一就是下面要提到的

3

3.1 定义

树(Tree)是n(n≥0)个结点的有限集T,T为空时称为空树,否则它满足如下两个条件: (1)有且仅有一个特定的称为根(Root)的结点; (2)其余的结点可分为m(m≥0)个互不相交的子集Tl,T2,…,Tm,其中每个子集本身又是一棵树,并称其为根的子树(Subree)。

一棵非空树是由若干棵子树构成的,而子树又可由若干棵更小的子树构成

3.2 节点的degree(度)

节点所有的子树数

3.3 树的degree

最大的节点的度即为树的度