【数据结构】数据的存储结构

数据有有线性结构、树形结构、图状结构和集合四种逻辑结构,那么它们是如何存储的呢?

数据结构的存储结构有两种,分别是顺序存储和链式存储。顺序存储的特点是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系;链式存储的特点是借助指针表示数据元素质检单逻辑关系。

1.线性结构:结构中的元素之间存在着一对一的线性关系。

如图为一个线性结构,那么它的顺序存储和链式存储如何呢?如下图:

      顺序结构              链式结构

线性结构如数组的存法,按一定顺序存放;而链式结构如链表的存法,结点可以任意存放,如上图,所以要用next相连,以保证每一个结点都有唯一确定的前驱和后继。

2.树形结构:结构中的数据元素之间存在着一对一的线性关系。(这里我们以二叉树为例)

如图是一个简单的二叉树,其中6号结点不存在,其顺序存储如下图:

因为是二叉树,所以我们可以认为每个结点都有两个“孩子”,不存在的可以用“空”来表示(上图中的6号就是空),这样就可以用一行表示一个完整的二叉树,并且知道每一个结点所对应的前驱和后继。

至此我们就可以发现:

2,3对应的前驱是1;

4,5对应的前驱是2;

6,7对应的前驱是3。

这样我们就可以推导出几个关系:

若结点为i,则i的前驱是i/2;i的左后继是2i;i的右后继是2i+1。


下面再给大家一个例子供参考(其中符号∧代表空,也可用null表示):

那么二叉树的链式结构又如何呢?

二叉树的结点结构如下图:

LChild域指向该结点的左孩子,Data域记录该结点的数据,RChild域指向该结点的右孩子。二叉树的链式结构存储如下图所示:

我们可以让头指针指向A,则二叉链表结点结构的描述如下:

typedef struct Node
{
  DataType date;
  Struct Node *Lchild;
  Struct Node *Rchild;
}BiTNode, *BiTree;

为了方便访问某结点的双亲,还可以给链表结点增加一个双亲字段parent,用来指向其双亲结点。每个结点由四个域组成,其结点结构为:

在实际应用中,要根据二叉树的形态和具体要进行的操作来选择决定采用哪种存储结构。

3.图状结构:结构中的数据元素之间存在着多对多的任意关系。

以无向图为例,如下图所示:

则可得出关系为:

A:     (A,B) (A,C)

B:(B,A) (B,C)      (B,D)

C:(C,A) (C,B)      (C,D)

D:     (D,B) (D,C)

以数组的存储方式(邻接矩阵)进行存储可得:

其中“1”代表存在关系,“0”代表不存在关系。

将其转化为链式的形式如下图:

对其链式结构我们可采用指针数组(邻接表)的方式来连接单链表,其中的字母应换成相应的数组下标,如下图:

邻接矩阵是不错的一种图存储结构,但是,对于边数相对顶点较少的图,这种结构存在对存储空间的极大浪费。因此,找到一种数组与链表相结合的存储方法称为邻接表。图中每个顶点的所有邻接点构成一个线性表,由于邻接点的个数不定,所以,用单链表存储,无向图称为顶点的边表,有向图则称为顶点作为弧尾的出边表。

有向图情况类似,大家可以自己试一试。而在有向图中,对于带权值的网图,可以在边表结点定义中再增加一个数据域,存储权值信息即可。如下图:

时间: 2024-11-05 18:37:58

【数据结构】数据的存储结构的相关文章

js数据结构与算法存储结构

数据结构(程序设计=数据结构+算法) 数据结构就是关系,没错,就是数据元素相互之间存在的一种或多种特定关系的集合. 传统上,我们把数据结构分为逻辑结构和物理结构. 逻辑结构:是指数据对象中数据元素之间的相互关系,也是我们今后最需要关注和讨论的问题. 物理结构:是指数据的逻辑结构在计算机中的存储形式. 常用的数据结构有: 数组,队列(queue),堆(heap),栈(stack),链表(linked list ),树(tree),图(graph)和散列表(hash) 栈(stack):运算只在表的

数据结构 - 图的存储结构

图的抽象数据类型定义 图是一种数据结构,加上一组基本操作就构成了图的抽象数据类型. 图的抽象数据类型定义如下: ADT Graph{ 数据对象V:具有相同特性的数据元素的集合,称为顶点集. 数据关系R:R={VR} VR={<v,w>|<v,w>| v,w?V∧p(v,w) ,<v,w>表示 从v到w的弧,P(v,w)定义了弧<v,w>的信息 } 基本操作P: Create_Graph() : 图的创建操作. 初始条件:无. 操作结果:生成一个没有顶点的空图

数据结构之图(存储结构、遍历)

新学期开始了,开始专心于技术上了,上学期的寒假总是那么短暂,飘飘乎就这样逝去,今天补补上学期还没学完的数据结构---图,希望能和大家一起探讨,共同进步~ 定义: 图是由顶点集合及顶点间的关系集合组成的一种数据结构. 图的存储结构: 1.1 邻接矩阵 图的邻接矩阵存储方式是用两个数组来表示图.一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中的边或弧的信息. 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 看一个实例,下图左就是一个无向图. 从上面可以看出,无向图的边数组是一

数据结构 - 逻辑结构和存储结构

程序=算法+数据结构 N.沃思(Niklaus Wirth)教授提出: 程序=算法+数据结构 以上公式说明了如下两个问题: (1)算法决定如何构造和组织数据(算法→数据结构). (2)算法的选择依赖于作为基础的数据结构(数据结构→算法). 软件=程序+文档(软件工程的观点) 求解非数值计算的问题 主要考虑的是设计出合适的数据结构及相应的算法. 即:首先要考虑对相关的各种信息如何表示.组织和存储? 因此,可以认为:数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作

浅谈数据结构之二叉树存储结构实现(七)

树:是n个结点的有限集:n=0时称为空树.在任意一棵非空树中,有且只有一个特定的结点称为根结点:其余的结点可分为m(m>0)个互不相交的有限集,其中每一个有限集都是一棵子树.结点拥有的子树数称为结点的度:度为0的结点称为叶结点或者终端结点,度不为0的结点称为分支结点或者非终端结点:树的度就是树内各结点的度的最大值. 二叉树的特点有:(1).每个结点最多有两棵子树,所以二叉树不存在度大于2的结点(注意:不是只有两棵子树,而是最多有两棵子树,没有子树或者有一颗子树都是可以的);(2).左子树和右子树

数据结构 - 二叉树的存储结构

顺序存储结构 二叉树存储结构的类型定义: #define MAX_SIZE 100 typedef telemtype sqbitree[MAX_SIZE]; 用一组地址连续的存储单元依次"自上而下.自左至右"存储完全二叉树的数据元素. 对于完全二叉树上编号为i的结点元素存储在一维数组的下标值为i-1的分量中,如图6-6(c)所示. 对于一般的二叉树,将其每个结点与完全二叉树上的结点相对照,存储在一维数组中, 链式存储结构 设计不同的结点结构可构成不同的链式存储结构. (1) 结点的类

Visual LISP 第2章 数据类型、表达式和函数(4)数据的存储结构

计算机内由许多编了码的内存单元组成. 一个特定的内存单元的编号称为内存地址. 内存单元的内容可以是可以是数字也可以是另一个内存单元的地址. 内容是另一个内存单元的地址的内存单元被称为指向另一个内存单元的指针. 如果一个内存单元分为左右两部分,分别存放两个内存单元的地址,那么这个内存单元就有左右两个指针. 具有左右两个指针的内存单元称为结点.每个节点长度是12个字节,等分为左右两部分,作为左右指针,每个节点都有它的地址.AutoLISP通过这样的一些结点构成链表,以链表的方式存储各种数据. 1.符

数据结构 - 图的存储结构表示及其遍历 (DFS &amp;&amp; BFS)

1.邻接矩阵表示的图结构 /* 邻接矩阵表示的图结构 */ #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <queue> #include <stack> using namespace std; typedef char VertexType; //顶点类型应由用户定义 typedef int EdgeType; /

7. C#数据结构与算法 -- 存储结构(单链表)

C#定义并实现单链表 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Linked {     //单链表结点类,采用泛型       public class Node<T> {         private T data; //数据域,当前结点的数据           private