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打印出表 ...
随机推荐
- 05-树9 Huffman Codes
哈夫曼树 Yes 需满足两个条件:1.HuffmanTree 结构不同,但WPL一定.子串WPL需一致 2.判断是否为前缀码 开始判断用的strstr函数,但其传值应为char *,不能用在strin ...
- ios view的frame和bounds之区别(位置和大小)
前言: 学习ios开发有一段时间了,项目也做了两个了,今天看视频,突然发现view的frame和bound两个属性,发现bound怎么也想不明白,好像饶你了死胡同里,经过一番尝试和思考,终于弄明白bo ...
- hdu 4255 A Famous Grid
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4255 A Famous Grid Description Mr. B has recently dis ...
- android几种定时器机制及区别
在android中,经常用到的定时器主要有以下几种实现:一.采用Handler与线程的sleep(long )方法二.采用Handler的postDelayed(Runnable, long) 方法三 ...
- 4 我们的第一个c#程序
1. 控制台应用程序. 在我们这个培训中主要使用控制台应用程序来讲解知识点和做练习. 什么是控制台程序? 控制台程序运行在dos窗口.没有可视化的界面.可以通过Dos窗口进入输入和输出显示 ...
- bootstrap-fileinput 图片上传
bootstrap-fileinput 源文件 在网上下载 CSS: <link href="../../static/Bootstrap/css/plugins/bootstrap- ...
- Android实现KSOAP2访问WebService
Android实现KSOAP2访问WebService 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 代码实现 写一个工具类来给主界面使用,作用是使用 ...
- oracle增加表空间的四种方法,查询表空间使用情况
增加表空间大小的四种方法Meathod1:给表空间增加数据文件ALTER TABLESPACE app_data ADD DATAFILE'D:\ORACLE\PRODUCT\10.2.0\ORADA ...
- python 通过urllib模块在svn中下载文件
#_*_coding:utf-8_*_ import urllib def Schedule(a,b,c): ''' a:已经下载的数据块 b:数据块的大小 c:远程文件的大小 ''' per = 1 ...
- js之内置对象
内置对象(Global和Math):JS程序在执行之前就已经存在,开发人员不必再取实例化的内置对象 下面对Global对象进行介绍一下,Math用的不多就不做介绍了 1.Global对象 Global ...