javascript实现数据结构与算法系列:线性表的静态单链表存储结构
2014-04-16 11:00
513 查看
有时可借用一维数组来描述线性链表,这就是线性表的静态单链表存储结构。
在静态链表中,数组的一个分量表示一个结点,同时用游标(cur)代替指针指示结点在数组中的相对位置。
数组的第0分量可看成头结点,其指针域指示链表的第一个结点。
这种存储结构需要预先分配一个较大的空间,但在线性表的插入和删除操作时不需移动元素,
仅需要修改指针,故仍具有李安是存储结构的主要优点
结构图:
静态单链表的实现:
在静态链表中,数组的一个分量表示一个结点,同时用游标(cur)代替指针指示结点在数组中的相对位置。
数组的第0分量可看成头结点,其指针域指示链表的第一个结点。
这种存储结构需要预先分配一个较大的空间,但在线性表的插入和删除操作时不需移动元素,
仅需要修改指针,故仍具有李安是存储结构的主要优点
结构图:
静态单链表的实现:
(function(module){ function SLinkList(data, cur, MAXSIZE) { this[0] = {}; this[0].data = data; this[0].cur = cur; this.MAXSIZE = MAXSIZE || 1000; } module.exports = SLinkList; SLinkList.prototype = { /** * 在静态单链线性表L中查找第1个值为e的元素, * 若找到,则返回它在L中的位序 * @param data */ locateElem: function (data) { var i = this[0].cur; while (i && this[i].data !== data) { i = this[i].cur; } return i; }, /** * 将一维数组中各分量链成一个备用链表 * this[0].cur为头指针 */ initSpace: function () { for (var i = 0; i < this.MAXSIZE - 1; ++i) { this[i] = this[i] || {}; this[i].cur = i + 1; } this[this.MAXSIZE - 1] = this[this.MAXSIZE - 1] || {}; this[this.MAXSIZE - 1].cur = 0; }, /** * 若备用链表非空,则返回分配的结点下标,反则返回0 * @returns {*} */ malloc: function () { var i = this[0].cur; if (this[0].cur) this[0].cur = this[i].cur; return i; }, /** * 将下标为k的空闲结点回收到备用链表 * @param k */ free: function (k) { this[k].cur = this[0].cur; this[0].cur = k; }, /** * 在一维数组中建立表示集合(A-B)U(B-A) * 的静态链表,s为其头指针。 * @returns {*} */ difference: function (arr1, arr2) { // 初始化备用空间 this.initSpace(); // 生成s的头结点 var s = this.malloc(); // r指向s的当前最后结点 var r = s; // 删除A和B的元素个数 var m = arr1.length; var n = arr2.length; // 建立集合A的链表 for (var j = 0; j < m; ++j) { //分配结点 var i = this.malloc(); // 输入A元素的值 this[i].data = arr1[j]; // 插入到表尾 this[r].cur = i; r = i; } // 尾结点的指针为空 this[r].cur = 0; // 依次输入B的元素,若不在当前表中,则插入, // 否则删除 for (j = 0; j < n; ++j) { var b = arr2[j]; var p = s; // k指向集合中的第一个结点 var k = this[s].cur; // 在当前表中查找 while (k !== this[r].cur && this[k].data !== b) { p = k; k = this[k].cur; } // 当前表中不存在该元素,插入在r所指结点之后,且r的位置不变 if (k === this[r].cur) { i = this.malloc(); this[i].data = b; this[i].cur = this[r].cur; this[r].cur = i; // 该元素已在表中,删除之 } else { this[p].cur = this[k].cur; this.free(k); // 若删除的是r所指结点,则需修改尾指针 if (r === k) r = p; } } } }; var sl = new SLinkList(1, 0, 10); var ret = sl.difference([1, 2, 3], [3, 4, 5]); console.log(sl); })(this.module|| this);
相关文章推荐
- 数据结构(12)--二叉树的静态链表存储和遍历的实现
- 数据结构之线性表的静态单链表存储结构(应用求集合(A-B)&&(B-A))
- 线性表的链接存储结构(单链表)的实现
- 【数据结构】线性表的单链表存储结构表示和实现
- 8. C#数据结构与算法 -- 线性存储结构(线性表之顺序表,数组实现)
- 9. C#数据结构与算法 -- 线性存储结构(线性表之顺序表,动态数组和泛型实现)
- javascript实现数据结构与算法系列:栈 -- 顺序存储表示和链式表示及示例
- 线性表的静态单链表存储结构
- 线性表的静态单链表存储结构
- 数据结构之线性表-链式存储之静态链表(二)
- 线性表的静态单链表存储结构
- 广义表的首尾链表存储结构和扩展线性链表存储结构
- C++学习总结——顺序存储,链式存储,索引存储,哈希存储的优缺点,以及vector数组,list链表,十字链表,索引结构,hash表的实现
- 数据结构之线性表4单链表(静态单链表)
- 数据结构之---C语言实现广义表头尾链表存储表示
- 数据结构之线性结构-队列结构(静态队列的实现)
- 线性表的链式存储结构之单链表类的实现之补充_Java
- 数据结构与算法系列-串-串的基本概念与存储结构
- C语言 数据结构 线性表 单链表 线性表的链式存储结构之一
- 线性表的存储结构优缺点及编程实现一个单链表的建立,测长,打印