zoukankan      html  css  js  c++  java
  • 第二节:线性表→顺序表→链表 逐个击破

    一. 线性表

    1. 前言

      线性表,全名为线性存储结构。使用线性表存储数据的方式可以这样理解,即 “ 把所有(一对一逻辑关系的)数据用一根线儿起来,再存储到物理空间中 ”。这根线有两种串联形式,如下图,即顺序存储(集中存放)和链式存储(分散存放)。

       图 3a) 是多数人想到的存储方式,而图 3b) 却少有人想到。我们知道,数据存储的成功与否,取决于是否能将数据完整地复原成它本来的样子。如果把图 3a) 和图 3b) 线的一头扯起,你会发现数据的位置依旧没有发生改变。因此可以认定,这两种存储方式都是正确的。

    引出线性表的定义:

      将具有“一对一”关系的数据“线性”地存储到物理空间中,这种存储结构就称为线性存储结构(简称线性表)。

    PS:使用线性表存储的数据,如同向数组中存储数据那样,要求数据类型必须一致,也就是说,线性表存储的数据,要么全不都是整形,要么全部都是字符串。一半是整形,另一半是字符串的一组数据无法使用线性表存储。

    2. 顺序结构和链式结构

    线性表存储数据可细分为以下 2 种:

      如图 3a) 所示,将数据依次存储在连续的整块物理空间中,这种存储结构称为顺序存储结构(简称顺序表);

      如图 3b) 所示,数据分散的存储在物理空间中,通过一根线保存着它们之间的逻辑关系,这种存储结构称为链式存储结构(简称链表);

    也就是说,线性表存储结构可细分为顺序存储结构和链式存储结构。

    3. 前驱和后继

      数据结构中,一组数据中的每个个体被称为“数据元素”(简称“元素”)。对于具有“一对一”逻辑关系的数据,我们一直在用“某一元素的左侧(前边)或右侧(后边)”这样不专业的词,其实线性表中有更准确的术语:

    • 某一元素的左侧相邻元素称为“直接前驱”,位于此元素左侧的所有元素都统称为“前驱元素”;
    • 某一元素的右侧相邻元素称为“直接后继”,位于此元素右侧的所有元素都统称为“后继元素”;

    以图 1 数据中的元素 3 来说,它的直接前驱是 2 ,此元素的前驱元素有 2 个,分别是 1 和 2;同理,此元素的直接后继是 4 ,后继元素也有 2 个,分别是 4 和 5。如图下图所示:

    二. 顺序表

    1. 简介

      顺序表,全名"顺序存储结构",是线性表的一种。我们知道线性表是用来存储逻辑关系为 "一对一" 的数据,顺表也不例外。顺序表存储数据时,会提前申请一整块足够大小的物理空间,然后将数据依次存储起来,存储时做到数据元素之间不留一丝缝隙

      例如,使用顺序表存储集合 {1,2,3,4,5},数据最终的存储状态如下图:

      由此我们可以得出,将“具有 '一对一' 逻辑关系的数据按照次序连续存储到一整块物理空间上”的存储结构就是顺序存储结构。

       顺序表存储数据同数组非常接近。其实,顺序表存储数据使用的就是数组

     

    三. 链表

    1. 简介

      链表,别名链式存储结构 或 单链表,也是线性表的一种,用于存储逻辑关系为 "一对一"的数据。顺序表不同,链表不限制数据的物理存储状态,换句话说,使用链表存储的数据元素,其物理存储位置是随机的。

      例如,用链表存储 {1,2,3},数据的物理存储空间如下:

      

       上图根本无法体现出各数据之间的逻辑关系,对此,链表的解决方案是,每个数据元素在存储时都配备一个指针,用于指向自己的直接后继元素。如下图:

       

       由此我们得出:数据元素随机存储,并通过指针表示数据之间逻辑关系的存储结构就是链式存储结构

    2. 链表的节点

      链表中每个数据的存储都由以下两部分组成:

      (1). 数据元素本身,其所在的区域称为 数据域

      (2). 指向直接后继元素的指针,其所在的区域称为 指针域; 如下图所示:

       链表实际存储的是一个一个节点,真正的数据元素包含在这些节点中,如下图所示:

     

    3. 头节点、头指针和首元节点

      一个完整的链表需要由以下几部分构成:

      (1). 头指针:一个普通的指针,它的特点是永远指向链表第一个节点的位置。很明显,头指针用于指明链表的位置,便于后期找到链表并使用表中的数据;

      (2). 节点:链表中的节点又细分为头节点、首元节点和其他节点:

        A. 头节点:其实就是一个不存任何数据的空节点,通常作为链表的第一个节点。对于链表来说,头节点不是必须的,它的作用只是为了方便解决某些实际问题;

        B. 首元节点:由于头节点(也就是空节点)的缘故,链表中称第一个存有数据的节点为首元节点。首元节点只是对链表中第一个存有数据节点的一个称谓,没有实际意义;

        C. 其他节点:链表中其他的节点;

      因此,一个存储 {1,2,3} 的完整链表结构为:

     

       注:链表中有头节点时,头指针指向头节点;反之,若链表中没有头节点,则头指针指向首元节点。

    !

    • 作       者 : Yaopengfei(姚鹏飞)
    • 博客地址 : http://www.cnblogs.com/yaopengfei/
    • 声     明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
    • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
     
  • 相关阅读:
    Redis 字符串(String)
    Redis 哈希(Hash)
    Redis 键(key)
    Redis 命令
    Redis 数据类型
    Redis 配置
    Log4j 2X 日志文件路径问题
    shiro项目从 log4j1X 迁移到 log4j2X
    shiro+SpringMVC 项目 配置404页面
    邮件发送-》http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256
  • 原文地址:https://www.cnblogs.com/yaopengfei/p/12567230.html
Copyright © 2011-2022 走看看