前言:前面介绍的线性表的顺序存储结构和链式存储结构中,都有对对象地引用或指向,也就是编程语言中有引用或者指针,那么在没有引用或指针的语言中,该怎么实现这个的数据结构呢?

一、简介

定义:用数组代替指针或引用来描述单链表,即用数组描述的链表叫做静态链表,这种描述方法叫做游标实现法;
上面的静态链表图有两个数组游标数据,其中数据数组存储数据,而游标数组存储同下标为数据的下一个数据的下标值,简单模拟一下静态链表遍历的过程:
  1. 先查看下标为999的游标数组值:1;
  2. 根据游标数组值1,查找下标为1的数据:A;
  3. 然后查看游标数组为1的值:2;
  4. 根据游标数组值为2查找对应的数据数组的值:C;
  5. 然后循环3->4,直至游标数组的值为0;

二、代码实现

静态链表的创建:
  • 我们对数组的第一个和最后一个元素做特殊处理,他们的data不存放数据;
  • 我们通常把未使用的数组元素称为备用链表;
  • 数组的第一个元素,即下标为0的那个元素的cur就存放备用链表的第一个结点的下标;
  • 数组的最后一个元素,即下标为MAXSIZE-1的cur则存放第一个有数值的元素的下标,相当于单链表中的头结点作用;
静态链表创建代码实现:
 public class StaticChain<T> {//数据链private T[] datas;//游标链private int[] vernier;private Integer size;private Integer length = 1000;StaticChain() {datas = (T[])new Object[length];vernier = new int[length];//将游标链的末位(头结点)初始化为1(下一节点的位置)vernier[length-1]=1;//将游标链的首位(空闲位的位置)初始化为1vernier[0]=1;size = 0;}}

插入操作:

    1、获取游标链下标为0的值为空闲位置的下标,并将该值对应下标所在的值放在游标链下标为0的地方;

    2、在5的位置插入值F,并将下标为5的游标链的值修改为0;

    3、若插入值为末位则直接将对应下标为4的游标链的值改为5,否则循环查找要插入值的上一位,并对应下标为4的游标链的值改为5;

插入操作代码如下:

    //插入到第几个元素的后面public void add(Integer index,T t) throws Exception {if (index>size)throw new Exception("outof index");int insertIndex = vernier[0];if (index == size) {int freeIndex = vernier[insertIndex];//将空闲位置的下标放入游标链的首位vernier[0] = freeIndex;//将刚插入末位值对应下标的游标链的值置为0vernier[insertIndex] = 0;//将值插入对应的位置datas[insertIndex] = t;//获取第几个元素的游标链对应的值Integer preIndex = this.getIndex(index);//将上一个元素的游标链的值改为插入的值的下标vernier[preIndex] = insertIndex;size++;} else {//获取第index+1个元素的游标链对应的值Integer nextIndex = this.getIndex(index+1);//将插入位置下标对应的游标链的值改为下一个元素的位置vernier[insertIndex] = vernier[nextIndex];datas[insertIndex] = t;//将上一个元素的游标链的值改为插入的值的下标Integer preIndex = this.getIndex(index);vernier[preIndex] = insertIndex;size++;//重置游标链的首位为空闲值下标Integer endIndex = this.getIndex(size);vernier[0] = vernier[endIndex];vernier[endIndex] = 0;}}//查询几个元素的游标链对应的下标private Integer getIndex(Integer index) throws Exception {int k = length - 1;for (int i = 1; i <= index; i++)k = vernier[k];if (k==-1) {throw new Exception("outof index");}return k;}

add()

删除操作:

   1、查找到要删除的节点的下标,将其对应的游标链的值取出来放在上一个游标链的指;

   2、并将删除的结点对应的游标链的值改为当前空闲指的下标,将空闲值的下标改为当前删除节点的下标;

删除操作代码如下:
    //删除第index个元素public T remove(Integer index) throws Exception {T data = null;if (index == 1) {Integer delIndex = vernier[999];data = datas[delIndex];int nextIndex = vernier[delIndex];vernier[length-1] = nextIndex;vernier[delIndex] = vernier[0];vernier[0] = delIndex;} else {Integer delIndex = this.getIndex(index);data = datas[delIndex];int nextIndex = vernier[delIndex];Integer preIndex = this.getIndex(index - 1);vernier[preIndex] = nextIndex;vernier[delIndex] = vernier[0];vernier[0] = delIndex;}return data;}

三、总结

  优点:
  • 在插入和删除操作时,只需要修改游标,不需要移动元素,从而改进了在顺序存储结构中的插入和删除操作需要移动大量元素的缺点;
  • 解决了在某些没有引用和指针的高级语言中无法创建线性表的链式存储结构;
缺点:
  • 没有解决连续存储分配(数组)带来的表长难以确定的为题;
  • 失去了顺序存储结构随机存取的特性;
在这里就要说一下静态链表和动态链表的区别:
  • 静态链表是数组实现的,是顺序存储结构,在物理地址上是连续的,而且需要预先分配大小。而动态链表适用内存申请函数(malloc)动态申请内存的,所以每个节点的物理地址是不连续的,要通过指针来顺序访问;
  • 静态链表的大小是一开始就定好的,所以当数组放满后就无法再放入了。而动态链表则无需考虑这种情况,随时加随时用;
总结:静态链表其实是为了给没有指针或引用的编程语言设计的一种实现单链表功能的方法,这种思想还是需要了解一下的——取他山之石以攻玉!

本系列参考书籍:

  《写给大家看的算法书》

  《图灵程序设计丛书 算法 第4版》

转载于:https://www.cnblogs.com/lfalex0831/p/9641284.html

数据结构与算法(三)-线性表之静态链表相关推荐

  1. 数据结构与算法(一) 线性表之顺序表

     线性表是一种最简单.最常用的数据结构,根据存储方式可以分为顺序表和链表.  顺序表: 顺序表指的是用一组地址连续的存储单元依次存储线性表的数据元素,称为线性表的顺序存储结构或顺序映像(sequent ...

  2. 从零开始学数据结构和算法(二)线性表的链式存储结构

    链表 链式存储结构 定义 线性表的链式存储结构的特点是用一组任意的存储单元的存储线性表的数据元素,这组存储单元是可以连续的,也可以是不连续的. 种类 结构图 单链表 应用:MessageQueue 插 ...

  3. 遗世蒹葭~小甲鱼~数据结构和算法_02~线性表

    线性表 顺序存储结构:数组 #define MAXSIZE 20 typedef int ElemType; typedef struct { ElemType data[MAXSIZE]; int ...

  4. 黑马程序员 C语言数据结构与算法之线性表(链表/栈/队列/顺序表)

    C语言 链表基础知识清晰讲解(黑马) 讲的蛮好,就是音质不太好,有时听不清讲的啥! [黑马]数据结构与算法之线性表(链表/栈/队列/顺序表)[配套源码 嘛蛋,看错了,这是java的... 文章目录 链 ...

  5. rsa算法c语言实现_数据结构与算法之线性表-顺序表实现(C语言版本)

    原文托管在Github: https://github.com/shellhub/blog/issues/52 数据结构与算法之线性表-顺序表实现(C语言版本) 前言 数据结构与算法是一个程序员必备的 ...

  6. 数据结构和算法基础--线性表

    数据结构和算法基础–线性表 数据结构 = 数据的逻辑结构+数据的存储结构+数据的运算 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-28ek7MfI-164242629 ...

  7. Java数据结构和算法:线性表

    线性表的定义 线性表(linear-list)是最常用最简单的一种数据结构.一个线性表是n (n≥0)个相同类型数据元素的有限序列.记为: L= (a1, a2 , - , an ). 其中,L是表名 ...

  8. 数据结构和算法———P6 线性表

    线性表 线性表(List): 由零个或多个数据元素组成的有限序列 关键: 首先他是一个序列,也就是说元素之间是有先来后到的 若元素存在多个,则第一个无前驱,最后一个无后继,其他元素都有且仅有一个前驱和 ...

  9. 学习笔记-数据结构与算法之线性表

    目录 框架图 线性表 顺序结构 创建线性表 输出验证 获取第i个元素 插入元素到特定位置 删除特定位置元素 整体代码 链式结构 创建链表 输出验证 获取第i个元素 插入元素 删除元素 删除整表 完整代 ...

  10. 数据结构与算法之线性表(超详细顺序表、链表)

    原创公众号:bigsai 文章已收录在 全网都在关注的数据结构与算法学习仓库 欢迎star 前言 通过前面数据结构与算法基础知识我么知道了数据结构的一些概念和重要性,那么我们今天总结下线性表相关的内容 ...

最新文章

  1. spoolsv.exe占CPU100% 的解决方法
  2. 实现人脸识别性别之路---open CV将图片显示出来
  3. Python基于socket实现的TCP服务端
  4. 在云服务器上执行C程序和python程序(centos系统)
  5. avalon2学习教程04显示隐藏处理
  6. 简单计算器 (关于栈的一种应用)
  7. 厉害了 | 一秒切换Hexo中英文,厉害了!!
  8. 能根治乱象了?豆瓣私密小组将全部停用
  9. springboot16 整合MyBatis
  10. oracle 函数 if 判断,oracle 判断中文函数
  11. Mac修改登陆界面背景图片,开机登陆界面,替换沙漠背景图 @macOS Mojave - 10.14.x
  12. java基于ssm框架开发的高校实验室预约管理系统实战项目
  13. 电脑网络重置后如何连接网络
  14. 数学建模----拟合的实现
  15. tp-link tl-wr740n 虚拟服务器,TPlinktl-wr740n服务器无响应,路由器上的广域网信号? 爱问知识人...
  16. linux动画制作软件,你也可以成为设计师!宫崎骏御用2D动画制作软件
  17. 3P 你需要知道的事
  18. MAC-XXL_JOB学习踩坑记录-Failed to create parent directories for [/data/applogs/xxl-job/xxl-job-admin.log
  19. 软件之外、软件是什么、怎么做软件
  20. python修改json中的文件内容并保存

热门文章

  1. 注册表实现欢迎界面的修改
  2. java_oop_三大特性
  3. 面向意图的SDN北向接口
  4. Xml读取和写入以及新建
  5. centos linux服务器优化之系统服务优化
  6. JavaScript:学习笔记(7)——VAR、LET、CONST三种变量声明的区别
  7. Bytom矿池接入协议指南
  8. springboot2的redis缓存管理器cacheManager配置,使存入json格式数据
  9. 深入浅出妙用 Javascript 中 apply、call、bind
  10. Leetcode那点事儿