有时可借用一维数组来描述线性链表,这就是线性表的静态单链表存储结构

在静态链表中,数组的一个分量表示一个结点,同时用游标(cur)代替指针指示结点在数组中的相对位置。
数组的第0分量可看成头结点,其指针域指示链表的第一个结点。
这种存储结构需要预先分配一个较大的空间,但在线性表的插入和删除操作时不需移动元素,
仅需要修改指针,故仍具有李安是存储结构的主要优点

结构图:

静态单链表的实现:

  1. (function(module){
  2. function SLinkList(data, cur, MAXSIZE) {
  3. this[0] = {};
  4. this[0].data = data;
  5. this[0].cur = cur;
  6. this.MAXSIZE = MAXSIZE || 1000;
  7. }
  8. module.exports = SLinkList;
  9. SLinkList.prototype = {
  10. /**
  11. * 在静态单链线性表L中查找第1个值为e的元素,
  12. * 若找到,则返回它在L中的位序
  13. * @param data
  14. */
  15. locateElem: function (data) {
  16. var i = this[0].cur;
  17. while (i && this[i].data !== data) {
  18. i = this[i].cur;
  19. }
  20. return i;
  21. },
  22. /**
  23. * 将一维数组中各分量链成一个备用链表
  24. * this[0].cur为头指针
  25. */
  26. initSpace: function () {
  27. for (var i = 0; i < this.MAXSIZE - 1; ++i) {
  28. this[i] = this[i] || {};
  29. this[i].cur = i + 1;
  30. }
  31.  
  32. this[this.MAXSIZE - 1] = this[this.MAXSIZE - 1] || {};
  33. this[this.MAXSIZE - 1].cur = 0;
  34. },
  35. /**
  36. * 若备用链表非空,则返回分配的结点下标,反则返回0
  37. * @returns {*}
  38. */
  39. malloc: function () {
  40. var i = this[0].cur;
  41. if (this[0].cur) this[0].cur = this[i].cur;
  42. return i;
  43. },
  44. /**
  45. * 将下标为k的空闲结点回收到备用链表
  46. * @param k
  47. */
  48. free: function (k) {
  49. this[k].cur = this[0].cur;
  50. this[0].cur = k;
  51. },
  52. /**
  53. * 在一维数组中建立表示集合(A-B)U(B-A)
  54. * 的静态链表,s为其头指针。
  55. * @returns {*}
  56. */
  57. difference: function (arr1, arr2) {
  58. // 初始化备用空间
  59. this.initSpace();
  60. // 生成s的头结点
  61. var s = this.malloc();
  62. // r指向s的当前最后结点
  63. var r = s;
  64. // 删除A和B的元素个数
  65. var m = arr1.length;
  66. var n = arr2.length;
  67.  
  68. // 建立集合A的链表
  69. for (var j = 0; j < m; ++j) {
  70. //分配结点
  71. var i = this.malloc();
  72. // 输入A元素的值
  73. this[i].data = arr1[j];
  74. // 插入到表尾
  75. this[r].cur = i;
  76. r = i;
  77. }
  78. // 尾结点的指针为空
  79. this[r].cur = 0;
  80.  
  81. // 依次输入B的元素,若不在当前表中,则插入,
  82. // 否则删除
  83. for (j = 0; j < n; ++j) {
  84. var b = arr2[j];
  85. var p = s;
  86. // k指向集合中的第一个结点
  87. var k = this[s].cur;
  88. // 在当前表中查找
  89. while (k !== this[r].cur && this[k].data !== b) {
  90. p = k;
  91. k = this[k].cur;
  92. }
  93. // 当前表中不存在该元素,插入在r所指结点之后,且r的位置不变
  94. if (k === this[r].cur) {
  95. i = this.malloc();
  96. this[i].data = b;
  97. this[i].cur = this[r].cur;
  98. this[r].cur = i;
  99.  
  100. // 该元素已在表中,删除之
  101. } else {
  102. this[p].cur = this[k].cur;
  103. this.free(k);
  104. // 若删除的是r所指结点,则需修改尾指针
  105. if (r === k) r = p;
  106. }
  107. }
  108. }
  109. };
  110.  
  111. var sl = new SLinkList(1, 0, 10);
  112. var ret = sl.difference([1, 2, 3], [3, 4, 5]);
  113. console.log(sl);
  114. })(this.module|| this);

javascript实现数据结构与算法系列:线性表的静态单链表存储结构的更多相关文章

  1. javascript实现数据结构与算法系列

    1.线性表(Linear list) 线性表--简单示例及线性表的顺序表示和实现 线性表--线性链表(链式存储结构) 线性表的静态单链表存储结构 循环链表与双向链表 功能完整的线性链表 线性链表的例子 ...

  2. javascript实现数据结构与算法系列:栈 -- 顺序存储表示和链式表示及示例

    栈(Stack)是限定仅在表尾进行插入或删除操作的线性表.表尾为栈顶(top),表头为栈底(bottom),不含元素的空表为空栈. 栈又称为后进先出(last in first out)的线性表. 堆 ...

  3. 正整数构成的线性表存放在单链表中,编写算法将表中的所有的奇数删除。(C语言)

    /* 正整数构成的线性表存放在单链表中,编写算法将表中的所有的奇数删除 */ #include <stdio.h> #include <stdlib.h> typedef st ...

  4. javascript实现数据结构与算法系列:功能完整的线性链表

    由于链表在空间的合理利用上和插入,删除时不需要移动等的有点,因此在很多场合下,它是线性表的首选存储结构.然而,它也存在着实现某些基本操作,如求线性表长度时不如顺序存储结构的缺点:另一方面,由于在链表中 ...

  5. javascript实现数据结构与算法系列:循环链表与双向链表

    循环链表(circular linked list) 是另一种形式的链式存储结构.它的特点是表中最后一个结点的指针域指向头结点,整个表形成一个环. 循环链表的操作和线性链表基本一致,仅有细微差别. w ...

  6. javascript实现数据结构: 稀疏矩阵之三元组线性表表示

    稀疏矩阵(Sparse Matrix):对于稀疏矩阵,目前还没有一个确切的定义.设矩阵A是一个n*m的矩阵中有s个非零元素,设  δ=s/(n*m),称δ为稀疏因子, 如果某一矩阵的稀疏因子δ满足δ≦ ...

  7. javascript实现数据结构与算法系列:队列 -- 链队列和循环队列实现及示例

    1 队列的基本概念 队列(Queue):也是运算受限的线性表.是一种先进先出(First In First Out ,简称FIFO)的线性表.只允许在表的一端进行插入,而在另一端进行删除. 队首(fr ...

  8. 【数据结构与算法】线性表操作(C++)

    #include <stdio.h> #define maxSize 100 //定义整型常量maxSize值为100 /*顺序表的结构体定义*/ typedef struct SqLis ...

  9. Java数据结构与算法(1):线性表

    线性表是一种简单的数据类型,它是具有相同类型的n个数据元素组成的有限序列.形如如A0,A1,...,An-1.大小为0的表为空表,称Ai后继Ai-1,并称Ai-1前驱Ai. printList打印出表 ...

随机推荐

  1. 开机一会,出现长时间闪屏,并且跳出SendRpt error

    通过谷歌,发现任务管理器中的Report sending utility 是属于TortoiseSVN 的,所以卸载svn ,然后重启就ok了

  2. flask程序部署在openshift上的一些注意事项

    https://www.openshift.com/blogs/how-to-install-and-configure-a-python-flask-dev-environment-deploy-t ...

  3. oracle 分析函数(笔记)

    分析函数是oracle数据库在9i版本中引入并在以后版本中不断增强的新函数种类.分析函数提供好了跨行.多层次聚合引用值的能力.分析函数所展现的效果使用传统的SQL语句也能实现,但是实现方式比较复杂,效 ...

  4. 有关GIT

    今天上班,发现没什么事情. 就看了一些博客,发现有个不错的东西,分享一下. 参考:http://www.liaoxuefeng.com/wiki/0013739516305929606dd183612 ...

  5. linux下安装protobuf教程+示例(详细)

    (.pb.h:9:42: fatal error: google/protobuf/stubs/common.h: No such file or directory 看这个就应该知道是没有找到头文件 ...

  6. iOS学习之C语言函数

    一.函数的定义 返回值类型 函数名(参数类型 参数名, ...) { 功能语句; return 返回值; } 按照返回值和参数划分: 第一种: 无返回值 无参 void sayHello() { pr ...

  7. MVC4.0 WebApi如何自定义返回数据类型

    1.客户端可以通过HTTP Accept消息头来通知服务器客户端想要什么样的MIME类型数据,例如:application/json则代表告诉服务器想要的是Json数据 2.服务器端撇开客户端的请求类 ...

  8. Zybo智能小车识别图像中的文字

    智能小车识别图像中的文字 [TOC] 运行平台 这次的内容是基于Xilinx公司的Zybo开发板以及其配套的Zrobot套件开发 Zybo上面的sd卡搭载了Ubuntu12.04LTS的linux版本 ...

  9. [原]Java修炼 之 基础篇(二)Java语言构成

    上次的博文中Java修炼 之 基础篇(一)Java语言特性我们介绍了一下Java语言的几个特性,今天我们介绍一下Java语言的构成.        所谓的Java构成,主要是指Java运行环境的组成, ...

  10. Linux Shell常用技巧(目录)

    Linux Shell常用技巧(一) http://www.cnblogs.com/stephen-liu74/archive/2011/11/10/2240461.html一. 特殊文件: /dev ...