精华内容
下载资源
问答
  • C#写的顺序储存结构和链式储存结构,最简单基本的数据结构 目录 1、博客介绍 2、内容 3、推送 4、结语 1、博客介绍 本文所有代码摘自【数据结构(C#语音版)】——雷军环,邓文达,刘震编著。用C#写的最简单...

                   C#写的顺序储存结构和链式储存结构,最简单基本的数据结构


    目录

    1、博客介绍

    2、内容

    3、推送

    4、结语


    1、博客介绍

           本文所有代码摘自【数据结构(C#语音版)】——雷军环,邓文达,刘震编著。用C#写的最简单的顺序存储结构和链式存储结构。


    2、内容

    ------------------------固定长度的顺序存储结构-------------------------
    /// <summary>
    /// 固定长度的顺序存储结构
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class SeqStructure<T>
    {
        private T[] _data;
        private int _i;
    
        public SeqStructure(int size)
        {
            _data = new T[size];
        }
    
        public void AddData(T var)
        {
            _data[_i++] = var;
        }
    }
     ----------------------------单向链式结构-----------------------------
    
    /// <summary>
    /// 单向链式结构基础元素
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class LinkedNode<T>
    {
        private T _data;
    
    
        private LinkedNode<T> _next;
    
        public LinkedNode()
        {
            _data = default(T);
            _next = null;
        }
    
        public LinkedNode(T val)
        {
            _data = val;
            _next = null;
        }
    
        public T Data
        {
            get { return _data; }
            set { _data = value; }
        }
    
        public LinkedNode<T> Next
        {
            get { return _next; }
            set { _next = value; }
        }
    }
    
    class LinkedStructure<T>
    {
        private LinkedNode<T> _first;
        private LinkedNode<T> _current;
    
        public LinkedStructure()
        {
            _first = null;
        }
    
        public void AddData(LinkedNode<T> var)
        {
            if (_first==null)
            {
                _first = var;
                _current = var;
            }
            else
            {
                _current.Next = var;
                _current = var;
            }
        }
    }

     

     ----------------------------双向链式结构-----------------------------
    
    
    
    public class DbNode<T>
    {
        private T _data;//数据
    
        private DbNode<T> _prev;//前驱引用域
        private DbNode<T> _next;//后驱引用域
    
        public DbNode(T val, DbNode<T> p)
        {
            _data = val;
            _next = p;
        }
    
        public DbNode(DbNode<T> p)
        {
            _next = p;
        }
    
        public DbNode(T val)
        {
            _data = val;
            _next = null;
        }
    
        public DbNode()
        {
            _data = default(T);
            _next = null;
        }
    
        public T Data
        {
            get { return _data; }
            set { _data = value; }
        }
    
    
        public DbNode<T> Prev
        {
            get { return _prev; }
            set { _prev = value; }
        }
    
        public DbNode<T> Next
        {
            get { return _next; }
            set { _next = value; }
        }
    }
    
    

     


    3、推送

    博主Github:https://github.com/KingSun5


    4、结语

           本文不作过多介绍,加深对数据结构的认识,有兴趣的可以直接去买本书看看,若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。

           QQ交流群:806091680(Chinar)

           该群为CSDN博主Chinar所创,推荐一下!我也在群里!

    展开全文
  • 这里写目录标题顺序储存结构一,什么是顺序储存?二,怎样实现顺序存储?链式储存结构 顺序储存结构 一,什么是顺序储存? 线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素。 二,怎样实现...

    顺序储存结构

    1,什么是顺序储存?

    线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素。

    2,怎样实现顺序存储?

    使用一维数组来实现存储顺序表中的数据

    顺序储存示意图如下:
    在这里插入图片描述

    一, 插入数据操作

    插入数据实现过程如图;
    在这里插入图片描述
    插入算法思路:

    • 如果插入的位置不合理,抛出异常;
    • 如果顺序表的长度大于数组长度,就抛出异常或动态增加容量;
    • 从最后一个元素开始向 i 的位置遍历,分别将它们后移一个位置;
    • 在 i 的位置插入元素;
    • 表长加一。

    代码实现如下:

    //在线性表第i个元素前加入一个值为x的元素
    public void insert (int i, Object x) throws Exception  {
    	if(len == listElem.length){
    		throw new Exception("顺序表已满");
    		}
    	if(i < 0 || i > len){
    		throw new Exception("插入位置不合法");
    		}
    	for(int j = len; j > i; j--){
    		listElem[j] = listElem[j - 1];
    		}
    	listElem[i] = x;
    	len++;
    }
    
    

    二,删除操作

    删除操作过程如图
    在这里插入图片描述
    删除算法思路:

    • 如果删除位置不合理,就抛异常;
    • 取出删除元素;
    • 从删除元素遍历到最后一个元素,分别将它们往后移一个位置;
    • 表长减一。
      代码实现如下:
    //删除指定位置上的元素
    public void remove(int i) throws Exception {
    	if(i < 0 || i > len - 1)
    		throw new Exception("删除位置不合法");
    	for(int j = i; j < len - 1; j++)
    		listElem[j] = listElem[j + 1];
    	len--;
    }
    
    

    三, 顺序储存的优缺点

    在这里插入图片描述

    展开全文
  • 图的储存结构

    2021-01-14 15:00:41
    图的储存结构 1.邻接矩阵法 指用一个一维数组储存图中顶点的信息,用一个二维数组储存图中边的信息(即各顶点之间的邻接关系),储存顶点之间邻接关系的二维数组称为邻接矩阵。 //特点: 1.无向图的邻接矩阵一定是一...

    图的储存结构

    1.邻接矩阵法

    指用一个一维数组储存图中顶点的信息,用一个二维数组储存图中边的信息(即各顶点之间的邻接关系),储存顶点之间邻接关系的二维数组称为邻接矩阵。

    //特点:
    1.无向图的邻接矩阵一定是一个对称矩阵(并且唯一),因此在实际的储存中只需要储存上三角或者下三角就行了
    2.对于无向图,邻接矩阵的第i行的非0元素个数正好是第i个顶点的度TD(vi)
    3.对于有向图,邻接矩阵的第i行对应出度,第i列对应入度
    4.用邻接矩阵法储存图,很容易确定图中任意两个顶点的之间是否有相连,但是要确定图中有多少条边,则必须按行,按列对每一个元素进行检测,所花费的时间代价很大。
    5.稠密图适合使用邻接矩阵法进行表示
    6.设图G的邻接矩阵A,A的n次方的元素A^n[i][j]对于由顶点i到顶点j的长度为n的路径的数目。
    

    在这里插入图片描述

    2.邻接表法

    指对图G中的每一个顶点Vi单独建立一个单链表,第i个单链表中的结点表示依附于顶点vi的边(对于有向图则是以顶点vi为尾的弧),这个单链表就称为顶点vi的边表(对于有向图则称为出边表)。

    边表的头指针顶点的数据信息采用顺序存储,所以在邻接表中存在两种结点:顶点表结点边表结点

    //特点
    1.若G为无向图,则所需储存空间为O(V+2E),V是顶点个数,E是边数。有向图的存储空间为O(V+E)
    2.对于稀疏图,采用邻接表表示极大节省空间
    3.在邻接表中,给定顶点,很容易找到它的所有邻边,而在邻接矩阵中要扫描一行,花费为O(n)。但是如果要确定给定的两个顶点之间是否存在边,则在邻接矩阵中很快可以查到,但是在邻接表中需要遍历链表。
    4.在有向图的邻接表表示,计算出度即计算其邻接表的结点个数,但是求其顶点的入度则需要遍历全部的邻接表。
    5.图的邻接表表示方法不唯一
    

    3.十字链表-储存有向图

    在这里插入图片描述

    十字链表法中有两种节点一种弧节点,一种顶点节点。

    弧节点中有5个域:尾域(tailvex)和头域(headvex)分别指向弧尾和弧头这两个顶点在图中的位置;链域hlink指向弧头相同的下一条弧;链域tlink指向弧尾相同的下一条弧;info域指向该弧的相关信息。这样,弧头相同的弧就在一个链表上,弧尾相同的弧也在同一个链表上。

    特点:

    在十字链表中,即容易找到Vi为尾的弧,又容易找到Vi为头的弧,因而容易求得顶点的出度和入度。图的十字链表表示不是唯一的,但一个十字链表表示一个确定的图。

    顶点节点之间是顺序储存的。

    4.邻接多重表-储存无向图

    在这里插入图片描述

    5.四种储存方式的对比

    在这里插入图片描述

    图的基本操作

    在这里插入图片描述

    展开全文
  • 几种树的储存结构

    2020-12-18 13:33:42
    1、顺序储存结构 利用一段连续的储存空间,即数组的形式,按照满二叉树的结构,从上到下,从左到右,按顺序将元素存入数组中,空缺的元素用零补齐。对于满二叉树和完全二叉树,数组中没有零元素,空间利用率达到100%...

    一、二叉树

    1、顺序储存结构

    利用一段连续的储存空间,即数组的形式,按照满二叉树的结构,从上到下,从左到右,按顺序将元素存入数组中,空缺的元素用零补齐。对于满二叉树和完全二叉树,数组中没有零元素,空间利用率达到100%。但其余情况下空间利用率低,所以顺序储存结构最适用于完全二叉树(满二叉树可以视为完全二叉树);

    2、链式储存结构

    使用链表储存,链表的每个结点的储存结构为:数据域 + 左孩子指针 + 右孩子指针

    这样的储存结构优势在于不论何种形式的二叉树都可以较好的利用空间,但是由于叶子结点的左右指针域都为空,没有很好的利用上。

    二、树

    1、Parents表示法(即书中所谓双亲表示法,这种翻译怎么看怎么奇怪)

    使用一组连续的空间储存(即数组),数组中每个元素的储存结构为:数据域 + Parents地址域

    将树中的所有元素按照从上到下,从左到右的顺序依次记录到数组中对应的各数据域,再将其Parents的地址(在数组中就是Parents的序号)分别存入对应的指针域。树的根没有Parents(孤儿),所以指针域置为-1或其他约定好的数字。

    Parents表示法的优势在于方便找到各元素的Parents结点,但要找到某个元素的子节点就必须要遍历整个数组,时间复杂度较高。

    2、孩子表示法

    有两种方法可以实现:

    • 使用链表加数组的形式储存,结点的结构为:数据域 + 孩子指针。

      将树中的所有元素(例如n个)的孩子元素按照顺序形成一个单链表,这样就获得了n个单链表(叶子元素只有它自身),同时为了方便查找,将所有的单链表的首元结点(也就是该链表中所有孩子的Parents元素),实际上就是树中的全部元素按照顺序储存到一个连续的空间(即一个数组之中)。储存在数组中的目的是便于查找。

    • 使用多重链表的形式储存

      使用多重链表,即一个结点中有多个指针域,可以指向其所有的孩子结点。多重链表的每个结点可以是同构的,即所有的结点大小都为树的度(degree);也可以是异构的,这时就需要在结点中添加一个“度域”,用于表示当前结点下对应的孩子个数。

    孩子表示法总体来说就是通过链表的形式,表示出树中每个元素的孩子元素。孩子表示法可以很方便找到元素的孩子,但是不容易找到它的Parents。

    3、Parents-Children表示法

    通过吸收孩子表示法和Parents表示法各自的优势,在孩子表示法的第一种实现的基础上,在储存所有元素的数组中,给每个元素都添加一项其Parents的地址(这里当然是数组中的序号)

    其实数组和链表从储存形式上来说并没有不可逾越的鸿沟,它们都可以相互改造生成的,数组和链表表现有差异的地方在于进行基本的线性表处理时(比如增删改查)的方便程度

    4、孩子兄弟法

    这是应用最为普遍的储存结构。使用链表的形式进行储存,链表中每个结点的结构为:首孩子地址域 + 数据域 + 兄弟地址域。

    这样的储存方式可以很好的找到所有的孩子结点,同时这样的结构和二叉树的二叉链表的形式完全相同,便于将一般的树转变为二叉树处理。

    三、Huffman树

    Huffman树严格来说是一棵二叉树,但是由于其:
    1、需要通过向上回溯直至根结点以此来得到某个叶子结点的Huffman编码,所以每个元素都必须有其Parents的地址;
    2、需要知道元素是其Parents的左孩子还是右孩子(决定了编码为0还是1);
    3、Huffman树构造的过程中依赖各结点的权重,所以需要开辟权重域。
    综上所述,需要建立一个专门为Huffman树服务的数据结构。

    Huffman树查找频繁,所以肯定优先考虑数组结构;结合以上的需求分析,Huffman树的每个结点都要知道其左右孩子和Parents的地址(即数组中元素的序号),且不需要设置数据域。所以使用复合数组,数组中每个元素分别包含:Parents地址 + 左孩子地址 + 右孩子地址 + 权重域。这样的结构既方便回溯,同时也方便建立Huffman结构(提供权重域,便于在建立过程中储存子树根结点的权重值)。

    展开全文
  • 队列的链式储存结构 文章目录队列的链式储存结构链队列的基本定义链队列的基本操作初始化队列求队列长度入队列操作出队列函数打印该队列项目整体源代码: 链队列的基本定义 队列是只允许在一端进行插入操作,而在另...
  • 关于线性表有两种储存结构第一是顺序储存结构;第二是链式储存结构,即所谓的链表 以下是顺序储存结构的C语言代码 在大学之中,一个宿舍就是有几个同学比较懒,起床迟,还要上高数课有一个好座位,怎么办呢?这时候...
  • 线性储存结构
  • 循环队列的顺序储存结构 文章目录循环队列的顺序储存结构队列的基本定义队列的基本操作初始化队列求队列长度入队列操作出队列函数打印该队列项目整体源代码: 队列的基本定义 队列是只允许在一端进行插入操作,而在...
  • //有关线性表顺序储存结构的删除,插入,查找操作 #include #define MAXSIZE 100 typedef int elemType; typedef struct { elemType list[MAXSIZE]; int last; }SeqList; //创建空表 void ...
  • 栈的链式储存结构的c语言实现 文章目录栈的链式储存结构的c语言实现链栈的基本定义链栈的基本操作结构体的定义链栈的初始化栈的入栈函数栈的出栈函数返回栈的长度得到栈顶元素打印出该链栈 链栈的基本定义 采用链式...
  • 树的储存结构(二)

    2019-11-11 13:23:31
    树的储存结构 双亲储存结构 顺序存储结构 struct Ptree{ T data; int parent; }; 优点:可以快速的定位双亲结点 缺点:如果要找子结点需要遍历全部 孩子链存结构 struct TsonNode{ T data; ...
  • 栈的链式储存结构

    2018-12-04 10:11:02
    // 栈的链式储存结构 // // Created by 柯木超 on 2018/12/4. // Copyright © 2018 柯木超. All rights reserved. // #include &lt;iostream&gt; // 链式栈的基本数据单元 typedef struct ...
  • 栈的顺序储存结构的c语言实现 文章目录栈的顺序储存结构的c语言实现顺序栈的基本定义顺序栈的基本操作结构体声明初始化函数进栈的函数出栈的函数打印出该栈求栈的长度求栈顶元素 顺序栈的基本定义 栈是一种特殊的...
  • 线性表的顺序储存结构——顺序表 线性表的顺序存储结构称为顺序表   顺序表的实现 const int MaxSize=100; template&lt;class DataType&gt; class SeqList { public: SeqList(){length=0;} //无参...
  • 堆分配储存结构的串

    千次阅读 2017-03-18 11:00:57
    串在程序中是不可或缺的。char a[]="abcd",就是一个字符串。学习串的目的就是为了对串进行操作。 不过,编译器已经有专门的库来对串进行操作了。...堆分配储存结构的串既有顺序储存结构的特点,处理方便,操作中对
  • 图的几种储存结构

    千次阅读 2017-05-22 12:49:50
    昨天借了两本图论的书, 才发现我之前的做法有点笨, 一点优化都没有.. 于是把一上午看的图的储存结构写了一边. 各种结构的优缺点总结了一下.
  • 链式储存结构——链表 链表的定义 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时...
  • 栈的储存结构及相关操作 1.实现栈的存储结构及相关操作:进栈、出栈、取栈顶元素等 2.使用该栈完成一个字符串的逆序输出 3.使用该栈完成表达式的括号是否匹配? 4.对算术表达式求值 主要的相关实现函数 template <...
  • 图的储存结构  线性表是一对一关系,树是一对多关系,而现实生活中还存在一些多对多关系。比如交通网络,多个交通枢纽之间的连线可能错综复杂,一个交通枢纽会连接其他多个交通枢纽,而这个交通枢纽也会被其他多个...
  • 话不多说,我们在日常使用数据库进行数据持 久化的时候有没有想过我们的数据在数据库中是什么样的储存结构,我们可能想的最多的是怎样进行SQL的调优,但是对于数据库都不熟悉能做到调优设计么?答案显然是不能!!...
  • 图的储存结构(邻接表)  图用邻接矩阵储存时,是用的一个二维数组,操作这个图的时候就相当于操作这个二维数组。但一但使用数组时就有一个很明显的缺点,那就是动态扩容性,基于邻接矩阵的图不能添加节点,只能添加...
  • 链式储存结构-单链表

    千次阅读 2014-11-04 19:45:50
    链式储存结构-单链表 逻辑结构  单个结点由数据域与一个指针域相结合而成(如图1)。数据域中的数据类型可以是任意类型,比如说是int,float,double等。指针域中指针指向后继元素,即存放后继元素的物理储存地址...
  • 话不多说,我们在日常使用数据库进行数据持 久化的时候有没有想过我们的数据在数据库中是什么样的储存结构,我们可能想的最多的是怎样进行SQL的调优,但是对于数据库都不熟悉能做到调优设计么?答案显然是不能!!...
  • 广义表的储存结构和结点定义(Java语言描述)
  • 数据结构线性表顺序储存结构
  • 线性表顺序储存结构的优缺点 优点: 无须为表示表中元素之间的逻辑关系而增加额外的存储空间。 可以快速存取表中 任意位置的元素。 缺点 插入和删除操作需要移动大量元素。 当线性表长度变化较大的时候,难以...
  • /** 栈(链式储存结构) */ public class LinearlinkStack { Entry linkStack; public LinearlinkStack(){ linkStack =new Entry(); } class Entry{ Object date; Entry next; } public
  • 邻接表是图的一种链式储存结构。 在边数小于节点数的图中,如果继续使用邻接矩阵,那么就会造成资源浪费。比如我们有一个有图,一共五个节点,却只有4 条边,生成5*5的邻接矩阵时,此时在这25个内存空间中只有4个被...
  • 线性表及其顺序储存结构
  • 线性表的顺序储存结构定义(动态)实现

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,573
精华内容 3,429
关键字:

储存结构