javascript实现数据结构与算法系列:线性表的静态单链表存储结构
有时可借用一维数组来描述线性链表,这就是线性表的静态单链表存储结构。
在静态链表中,数组的一个分量表示一个结点,同时用游标(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);
javascript实现数据结构与算法系列:线性表的静态单链表存储结构的更多相关文章
- javascript实现数据结构与算法系列
1.线性表(Linear list) 线性表--简单示例及线性表的顺序表示和实现 线性表--线性链表(链式存储结构) 线性表的静态单链表存储结构 循环链表与双向链表 功能完整的线性链表 线性链表的例子 ...
- javascript实现数据结构与算法系列:栈 -- 顺序存储表示和链式表示及示例
栈(Stack)是限定仅在表尾进行插入或删除操作的线性表.表尾为栈顶(top),表头为栈底(bottom),不含元素的空表为空栈. 栈又称为后进先出(last in first out)的线性表. 堆 ...
- 正整数构成的线性表存放在单链表中,编写算法将表中的所有的奇数删除。(C语言)
/* 正整数构成的线性表存放在单链表中,编写算法将表中的所有的奇数删除 */ #include <stdio.h> #include <stdlib.h> typedef st ...
- javascript实现数据结构与算法系列:功能完整的线性链表
由于链表在空间的合理利用上和插入,删除时不需要移动等的有点,因此在很多场合下,它是线性表的首选存储结构.然而,它也存在着实现某些基本操作,如求线性表长度时不如顺序存储结构的缺点:另一方面,由于在链表中 ...
- javascript实现数据结构与算法系列:循环链表与双向链表
循环链表(circular linked list) 是另一种形式的链式存储结构.它的特点是表中最后一个结点的指针域指向头结点,整个表形成一个环. 循环链表的操作和线性链表基本一致,仅有细微差别. w ...
- javascript实现数据结构: 稀疏矩阵之三元组线性表表示
稀疏矩阵(Sparse Matrix):对于稀疏矩阵,目前还没有一个确切的定义.设矩阵A是一个n*m的矩阵中有s个非零元素,设 δ=s/(n*m),称δ为稀疏因子, 如果某一矩阵的稀疏因子δ满足δ≦ ...
- javascript实现数据结构与算法系列:队列 -- 链队列和循环队列实现及示例
1 队列的基本概念 队列(Queue):也是运算受限的线性表.是一种先进先出(First In First Out ,简称FIFO)的线性表.只允许在表的一端进行插入,而在另一端进行删除. 队首(fr ...
- 【数据结构与算法】线性表操作(C++)
#include <stdio.h> #define maxSize 100 //定义整型常量maxSize值为100 /*顺序表的结构体定义*/ typedef struct SqLis ...
- Java数据结构与算法(1):线性表
线性表是一种简单的数据类型,它是具有相同类型的n个数据元素组成的有限序列.形如如A0,A1,...,An-1.大小为0的表为空表,称Ai后继Ai-1,并称Ai-1前驱Ai. printList打印出表 ...
随机推荐
- STM32F0xx_PWR低功耗配置详细过程
Ⅰ.概述 今天总结PWR部分知识,请看“STM32F0x128参考手册V8”第六章.提供的软件工程是关于电源管理中的停机模式,工程比较常见,但也是比较简单的一个实例,根据项目的不同还需要适当修改或者添 ...
- 刀哥多线程之一次性代码gcd-11-once
一次性执行 有的时候,在程序开发中,有些代码只想从程序启动就只执行一次,典型的应用场景就是"单例" // MARK: 一次性执行 - (void)once { static dis ...
- C#串口操作类,包括串口读写操作
串口进行操作的类,其中包括写和读操作,类可设置串口参数.设置接收函数.打开串口资源.关闭串口资源,操作完成后,一定要关闭串口.接收串口数据事件.接收数据出错事件.获取当前全部串口.把字节型转换成十六进 ...
- linux安装R语言
系统:centos 6.4 64bit 安装可以使用rpm包安装,也可以用源码安装. 但是rpm安装,各种依赖比较麻烦.所以我采用源码安装. 下载:http://www.r-project.org/ ...
- Linux下如何使CP命令不提示覆盖
在Linux下使用CP命令,经常会提示是否覆盖,如果是太批量的文件覆盖,老是这么提示,会很烦的.那如何解决这个问题呢? 我们先来看一下原因吧! 一般我们使用的命令是cp -rf sourcefile ...
- [转]ubuntu server上网配置
[转]ubuntu server上网配置 http://blog.sina.com.cn/s/blog_6c9d65a101011pyt.html 今天我的ubuntu server上不去网了,所以重 ...
- FPGA开发心得
创新源于模仿,另一个意思就是,我们需要站在巨人的肩膀上起航. 至芯科技培训注重于“按图施工”,在没有达到这种境界的时候,我们需要有我们自己的思想 我的思想: always 时钟分频 数据接收 上升沿和 ...
- verilog中级别到底是什么?级别的分类是什么???
1.级别到底是什么? 答:所谓的系统级,算法级,RTL级,门级,开关级,就是在不同的层次上来描述某个电路模块.当然行为级和结构级就是在行为上和结构上来描述电路模块. 模块可以用不同级别语言来描述,当然 ...
- 文件读写 swift
// // ViewController.swift // 文件读写 // // Created by mac on 15/7/12. // Copyright (c) 2015年 fangyuhao ...
- CommonsChunkPlugin的使用(关于angular2中的polyfills和vendor的疑问解决)
seed: angular2-webpack-starter(在github上可以找到) polyfills:提供api以方便兼容不同的浏览器 vendor:项目插件扩展 在学习ng2中一直不明白为什 ...