博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javascript实现数据结构与算法系列:线性表的静态单链表存储结构
阅读量:5025 次
发布时间:2019-06-12

本文共 3133 字,大约阅读时间需要 10 分钟。

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

在静态链表中,数组的一个分量表示一个结点,同时用游标(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);

 

转载于:https://www.cnblogs.com/webFrontDev/p/3668145.html

你可能感兴趣的文章
java的面向对象 (2013-09-30-163写的日志迁移
查看>>
HDU 2191 【多重背包】
查看>>
51nod 1433 0和5【数论/九余定理】
查看>>
【AHOI2013复仇】从一道题来看DFS及其优化的一般步骤和数组分层问题【转】
查看>>
less 分页显示文件内容
查看>>
如何对数据按某列进行分层处理
查看>>
[Qt] this application failed to start because it could not find or load the Qt platform plugin
查看>>
Git Submodule管理项目子模块
查看>>
学会和同事相处的30原则
查看>>
NOJ——1568走走走走走啊走(超级入门DP)
查看>>
文件操作
查看>>
Python:GUI之tkinter学习笔记3事件绑定(转载自https://www.cnblogs.com/progor/p/8505599.html)...
查看>>
jquery基本选择器
查看>>
hdu 1010 dfs搜索
查看>>
搭建wamp环境,数据库基础知识
查看>>
android中DatePicker和TimePicker的使用
查看>>
SpringMVC源码剖析(四)- DispatcherServlet请求转发的实现
查看>>
Android中获取应用程序(包)的大小-----PackageManager的使用(二)
查看>>
Codeforces Gym 100513M M. Variable Shadowing 暴力
查看>>
浅谈 Mybatis中的 ${ } 和 #{ }的区别
查看>>