• javascript实现数据结构与算法系列:线性表的静态单链表存储结构


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

    在静态链表中,数组的一个分量表示一个结点,同时用游标(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);
  • 相关阅读:
    04_数字信号滤波Matlab代码_常见操作
    03_FIR滤波器的设计
    CH340 USB to TTL connect to STM32F207 TTL UART
    linux内核中如果内存越界破坏了semphore同样会导致RCU STALL
    Build自己的kernel header
    事实证明,PHY Identify在外部电路异常情况下也是会发生变化的。
    vim配置参考
    技术经典图书(附电子版下载地址)
    转:linux内核源代码分析方法
    定期保存2017-04-19
  • 原文地址:https://www.cnblogs.com/webFrontDev/p/3668145.html
Copyright © 2020-2023  润新知