C/C++之数据结构

前言

下面我将记录学习到的c/c++语言相关的数据结构。

常用的数据结构

线性表

定义:由n个具有相同性质的数据元素组成的有穷序列。

特点:

  • 存在且唯一一个被称为:‘第一个’的元素,该元素没有直接的前驱元素;
  • 存在且唯一一个被称为:‘最后一个’的元素,该元素没有直接的后驱元素;
  • 除了 ‘第一个’ 外,表中每个元素有且仅有一个直接前驱;
  • 除了 ‘最后一个’ 外,表中每个元素有且仅有一个直接后驱;

现存线性表分类:
C/C++之数据结构_第1张图片

1. 顺序表(数组)

定义:申请一组地址连续存储单元用来存储线性表中的每个元素。

特点:逻辑关系相邻的元素,物理关系也是相邻的。

PS: c和c++的实现是不一样的。

2. 链表

定义:申请一组任意地址存储单元用来存储线性表中的每个元素。

特点:

  • 逻辑关系相邻的元素,物理关系并不一定相邻。
  • 每个元素节点除了要存储元素信息外,还需要存储后续元素的存储地址(指针)
  • 链表逻辑上的相邻关系通过指针连续。
  • 单链表只有一个头节点和一个尾节点
  • 只要知道链表的头节点,就能遍历整个链表。
    C/C++之数据结构_第2张图片

栈(stack)

定义:一种元素满足后进先出(Last in first out, LIFO)规则的线性表

特点:

  • 栈的本质是一种线性表, 但是具有其特殊的操作要求——元素后进先出。这种要求也决定了栈的操作是在表尾进行
  • 栈底(bottom):栈的表头
  • 栈顶(top):将栈的表尾,所以栈的所有操作都是在栈顶进行的。
  • 添加元素,称为入栈(push);删除元素,称为出栈(pop)。

实现:栈可以用顺序存储实现,也可以用链式存储实现,分别成为顺序栈和链栈。但一般使用顺序存储实现,因为栈不允许在栈中间进行插入和删除,需要准寻栈特有的规则。

定义:树是指由 n(n≥0)个结点组成的有穷集合。

树需要满足以下 3 个条件:

  • 当 n=0 时,该结点集合为空,该树被称为空树。
  • 在任意的非空树中,有且仅有一个根结点 root。
  • 当 n>1 时 ,除根结点以外的其余结点可以分为 m(m>0)个不相交的子集D1,D2,D3,…,Dm, 其中每一个这样的子集 Di(i≤m)本身又是一棵树, 称为根结点 root的子树

注意:

  • 树的定义是一个递归定义,因为树是由根结点和子树构成的,而每一个子树也是一棵树。
  • 树结构在形式上最主要的特点就是分层特点和具有一定的排列顺序。

树的表示方法:

  1. 树的表示方法
    C/C++之数据结构_第3张图片
  2. 文氏图表示法
    C/C++之数据结构_第4张图片
    基本术语:
  • 结点的度:结点拥有的直接子树数目。
  • 树的度:树中各结点度的最大值称为该树的度。如上图,树的度为3.
  • 分支结点:度不为 0 的结点称为分支结点或普通结点。
  • 叶子结点:度为 0 的结点称为叶子结点或终端结点。由此可知叶子结点没有子结点。
  • 结点的层次:从树的根结点开始,根结点为第 1 层,根结点的子结点为第 2 层,第 2 层结点的子结点为第 3 层……
  • 树的深度:树中结点的最大层次数被定义为该树的深度或高度。
  • 森林:n(n≥0)棵不相交的树的集合称为森林。

存储方式:

  • 顺序存储:顺序存储将二叉树的每一个节点和数组的编号一一对应,根据这个编号,可以找到该结点的父结点和孩子结点
  • 链式存储:二叉树的节点一般定义为:数据部分、左子树指针和右子树指针,用指针将节点串起来,其中 l 表示左孩子指针, r 表示右孩子指针,∧表示空指针

参考

C++常用数据结构

你可能感兴趣的:(c++,数据结构,编程语言,c++)