• 初初见你,编程海洋里你独自美丽(伍)


    线性表的链式存储结构

    顺序存储结构不足的解决方案

    顺序存储结构最大的缺点就是插入与删除时需要移动大量的元素,这需要消耗一定的时间。解决方案有以下几个:
    ①让每一个元素之间留一个空位置。这个思路一定程度上解决插入单个元素的问题,但是相邻元素如果插入多个元素,一样会出现最开始遇到的问题。
    ②每个相邻元素留足够多的位置。这种思路对遍历造成了一定程度的浪费,而且空间复杂度也增加了,并不是合适的解决方案。
    ③不考虑相邻元素的位置,哪里有位置就将插入元素,只是让每一个元素知道他的下一个元素在哪里,这样所有的元素都可以通过遍历。插入删除也不用移动元素。只不过因为要存储下一个数据元素的位置,因此空间复杂度会增加。

    以前在顺序结构中,每个数据元素只需要存储数据元素信息就可以了。现在链式存储结构,还要存储它的后继元素的存储地址。

    数据域、指针域、节点、单链表
    为了表示每个数据元素ai与其直接后继元素ai+1之间的逻辑关系,对数据元素ai来说,除了存储其本身的信息之外,还需存储一个指示其直接后继元素的信息(即直接后继元素的存储位置)。
    我们把存储数据元素信息的域称为数据域,把存储直接后继元素位置的域称为指针域。指针域中存储的信息称为指针或链。这两部分信息组成数据元素ai的存储映像,称为节点(Node)。
    n个节点(ai的存储映像)链接成一个链表,即线性表(a1,a2,...,an)的链式存储结构。因为此链表的每个节点中只包含一个指针域,所以叫单链表。
    链表中第一个节点的存储位置叫做头指针。
    最后一个元素不存在直接后继元素,因此我们规定链表的而最后一个节点指针为“空”(通常用"NULL"或"^"符号表示)。
    有时,我们为了方便对链表进行操作,会在单链表的第一个节点前附设一个节点,称为头结点。头结点的数据域可以不存储信息,也可以存储线性表的长度等附加信息。头结点的指针域指向第一个节点的指针。

    线性表的单链表存储结构

    typedef struct Node
    {
        ElemType data;
        struct Node *next;
    } Node;
    typedef struct Node *LinkList;  /* 定义LinkList */
    

    从这个结构定义中,我们也就知道,节点由存放数据元素的数据域和存放后继节点地址的指针域组成。假设p是指向线性表第i个元素的指针(位置是ai-1的指针域,值是ai的位置),则ai的数据域可以用p->data来表示,p->data的值是一个数据元素,节点ai的指针域可以用p->next来表示,它的值是一个指针,指向ai+1,即如果p->data=ai,则p-next->data=ai+1。如下图所示。

    当前介绍了线性表的链式存储结构一些基本概念以及具体的实现方式。通过对底层实现的理解,知道了它的时间复杂度。后面几篇,我会进一步介绍线性表的链式存储结构。欢迎大家可以关注我的微信公众号,方便利用零碎时间互相交流。共勉!

    路漫漫其修远兮,吾将上下而求索。。。

  • 相关阅读:
    angular 三大核心函数
    mongodb 怎样检测 安装成功 以及mongodb的一些增删改查命令
    前端自动化工具 -- gulp https://angularjs.org/
    ECMAscript一些方法的使用
    HBuilder使用技巧
    angular 本地存储
    WPF控件开发(2) 自动完成(AutoComplete)-1
    orecle查询关键字段存在的存储过程或Job
    flash 反编译 + 重新发布
    javascript高级程序设计--简介
  • 原文地址:https://www.cnblogs.com/caozz/p/linear_list2.html
Copyright © 2020-2023  润新知