• 数据结构学习系列之线性表(三)


    前言
    数据结构学习,发现坚持下来比较难,本次学习与上次学习间隔了几个月,不管怎样还是要强迫自己坚持下来。

    静态链表

    用数组模拟链式结构的线性表,对于没有指针的编程语言,只能使用这种方式来模拟。这是大师们想出来的实现方法,体会大师们的编程思路,站在大师们的肩膀上解决一个又一个的难题。每个节点包含一个游标(数组数字索引),用于指向下个节点,所以静态链表也称为游标链表。规定数组第一个元素为备用链表(未被使用的数组游标,静态链表初始化时,会生成备用链表)的头节点,数组最后一个元素为链表的头节点。当需要插入一个元素时,首先从备用链表取一个可用游标存储当前节点,备用链表头节点指向下个可用的空间,剩下操作跟链式线性表类似。当删除元素时,被删除元素的游标会被回收到备用链表,备用链表的头节点指向回收节点,被回收的节点指向备用链表头节点原来指向的节点,剩下操作跟链式线性表类似。

      1 /**
      2  * @desc 静态链表
      3  *
      4  * @author WadeYu
      5  * @date 2015-06-29
      6  */
      7 
      8 //数组元素长度
      9 var MAXSIZE = 1000;
     10 
     11 /**
     12  * @desc 元素
     13  *
     14  * @param mixed data 元素数据
     15  * @param int cursor 指向下个节点的游标
     16  *
     17  * @return void
     18  */
     19 var Element = function(data,cursor){
     20     this.data = data;
     21     this.cur = cursor;
     22 };
     23 
     24 /**
     25  * @desc 初始化
     26  *
     27  * @param array staticList 静态链表
     28  *
     29  * @return boolean
     30  */
     31 var ListInit = function(staticList){
     32     if(!isA(staticList)){
     33         return false;
     34     }
     35     for(var i = 0; i < MAXSIZE - 2; i++){
     36         staticList[i] = new Element(0,i+1);
     37     }
     38     staticList[MAXSIZE-2] = new Element(0,0);
     39     staticList[MAXSIZE-1] = new Element(0,0);
     40     return true;
     41 };
     42 
     43 /**
     44  * @desc 判断是否数组
     45  */
     46 var isA = function(a){
     47     return true;
     48 };
     49 
     50 /**
     51  * @desc 判断是否合法元素
     52  */
     53 var isElem = function(elem){
     54     return true;
     55 };
     56 
     57 /**
     58  * @desc 判断链表是否为空
     59  *
     60  * @param array staticList 静态链表
     61  *
     62  * @return boolean
     63  */
     64 var ListEmpty = function(staticList){
     65     if(!isA(staticList)){
     66         return true;
     67     }
     68     if(staticList[MAXSIZE-1].cur === 0){
     69         return true;
     70     }
     71     return false;
     72 };
     73 
     74 /**
     75  * @desc 插入元素
     76  *
     77  * @param array staticList 静态链表
     78  * @param int i 插入位置
     79  * @param object elem 插入元素
     80  *
     81  * @return boolean
     82  */
     83 var ListInsert = function(staticList,i,elem){
     84     if(!isA(staticList)){
     85         return false;
     86     }
     87     if(!isElem(elem)){
     88         return false;
     89     }
     90     if(i < 1 || ((i > 1) && (i > ListLength(staticList)))){
     91         return false;
     92     }
     93     var l = Malloc(staticList);
     94     if(l === 0){//链表空间已满
     95         return false;
     96     }
     97     staticList[l] = elem;
     98     var k = MAXSIZE-1;//第i-1个元素下标
     99     for(var j = 0; j < i - 1; j++){//寻找第i-1个元素下标
    100         k = staticList[k].cur;
    101     }
    102     staticList[l].cur = staticList[k].cur;
    103     staticList[k].cur = l;
    104     return true;
    105 };
    106 
    107 /**
    108  * @desc 删除元素
    109  *
    110  * @param int i 删除元素编号
    111  * @param array staticList 静态链表
    112  *
    113  * @return boolean
    114  */
    115 var ListDelete = function(staticList,i){
    116     if(!isA(staticList)){
    117         return false;
    118     }
    119     if(i < 1 || i > ListLength(staticList)){
    120         return false;
    121     }
    122     var k = MAXSIZE - 1;
    123     for(var j = 0; j < i - 1; j++){
    124         k = staticList[k].cur;
    125     }
    126     var l = staticList[k].cur;
    127     staticList[k].cur = staticList[l].cur;
    128     Mfree(staticList,l);
    129     return true;
    130 };
    131 
    132 /**
    133  * @desc 查找元素
    134  *
    135  * @param array staticList 静态链表
    136  * @param int i 编号
    137  *
    138  * @return object || boolean false 元素
    139  */
    140 var GetElem = function(staticList,i){
    141     if(!isA(staticList)){
    142         return false;
    143     }
    144     if(i<1 || i>ListLength(staticList)){
    145         return false;
    146     }
    147     var k = MAXSIZE - 1;
    148     for(var j = 0; j < i; j++){
    149         k = staticList[k].cur;
    150     }
    151     return staticList[k];
    152 };
    153 
    154 /**
    155  * @desc 定位元素
    156  *
    157  * @param array staticList 静态链表
    158  * @param object elem 元素
    159  *
    160  * @return int -1表示没找到
    161  */
    162 var LocateElem = function(staticList,elem){
    163     if(!isA(staticList)){
    164         return -1;
    165     }
    166     if(!isElem(elem)){
    167         return -1;
    168     }
    169     var i = staticList[MAXSIZE-1].cur;
    170     var j = 1;
    171     while(i){
    172         if(staticList[i].data === elem.data){
    173             return j;
    174         }
    175         j++;
    176         i = staticList[i].cur;
    177     }
    178     return -1;
    179 };
    180 
    181 /**
    182  * @desc 清空链表
    183  *
    184  * @param array staticList 静态链表
    185  *
    186  * @return boolean
    187  */
    188 var ListClear = function(staticList){
    189     if(!isA(staticList)){
    190         return false;
    191     }
    192     staticList[MAXSIZE-1].cur = 0;
    193     staticList[0].cur = 1;
    194     return true;
    195 };
    196 
    197 /**
    198  * @desc 获取链表长度
    199  *
    200  * @param array staticList 静态链表
    201  *
    202  * @return int
    203  */
    204 var ListLength = function(staticList){
    205     if(!isA(staticList)){
    206         return 0;
    207     }
    208     var i = 0,k = 0;
    209     k = staticList[MAXSIZE-1].cur;
    210     while(k){
    211         i++;
    212         k = staticList[k].cur;
    213     }
    214     return i;
    215 };
    216 
    217 /**
    218  * @desc 分配内存
    219  *
    220  * @param array staticList 静态链表
    221  *
    222  * @return int 可用游标
    223  */
    224 var Malloc = function(staticList){
    225     if(!isA(staticList)){
    226         return 0;
    227     }
    228     var cursor = staticList[0].cur;
    229     staticList[0].cur = staticList[cursor].cur;
    230     return cursor;
    231 };
    232 
    233 /**
    234  * @desc 释放内存
    235  *
    236  * @param array 静态链表
    237  * @param int 需要回收下标
    238  *
    239  * @return boolean
    240  */
    241 var Mfree = function(staticList,cursor){
    242     if(!isA(staticList)){
    243         return false;
    244     }
    245     staticList[cursor].cur = staticList[0].cur;
    246     staticList[0].cur = cursor;
    247     return true;
    248 };
    249 
    250 /**
    251  * @desc打印静态链表
    252  *
    253  * @param array 静态链表
    254  *
    255  * @return void
    256  */
    257 var print = function(staticList){
    258     var k = staticList[MAXSIZE-1].cur;
    259     var a = [];
    260     while(k){
    261        a.push(staticList[k].data);
    262        k = staticList[k].cur;
    263     }
    264     console.log(a.join(','));
    265 };
    View Code
    var staticList = [];
    
    console.log("初始化静态链表")
    ListInit(staticList);
    console.log("初始化静态链表的长度:");
    console.log(ListLength(staticList));
    console.log("静态链表是否为空:");
    console.log(ListEmpty(staticList) ? '是' : '否');
    
    console.log("------------------------");
    
    console.log("位置1循环插入10个元素:")
    for(var i = 0; i < 10; i++){
        ListInsert(staticList,1,new Element(i+1,0));
    }
    console.log("静态链表是否为空:");
    console.log(ListEmpty(staticList) ? '是' : '否');
    console.log("插入之后静态链表的长度:");
    console.log(ListLength(staticList));
    console.log("打印静态链表:");
    print(staticList);
    
    console.log("------------------------");
    
    console.log("位置3插入11");
    ListInsert(staticList,3,new Element(11,0));
    console.log("插入之后静态链表长度:")
    console.log(ListLength(staticList));
    console.log("打印静态链表:");
    print(staticList);
    
    console.log("-----------------------");
    console.log("删除第2个元素");
    ListDelete(staticList,2);
    console.log("静态链表长度:");
    console.log(ListLength(staticList));
    console.log("打印静态链表:");
    print(staticList);
    
    console.log("-----------------------");
    console.log("查找第1个元素:");
    console.log(GetElem(staticList,1));
    console.log("查到第20个元素:");
    console.log(GetElem(staticList,20));
    
    console.log("-----------------------");
    console.log("元素11编号:");
    console.log(LocateElem(staticList,new Element(11,0)));
    console.log("元素20编号:");
    console.log(LocateElem(staticList,new Element(20,0)));
    
    console.log("----------------------");
    console.log("清空静态链表");
    ListClear(staticList);
    console.log("静态链表长度:");
    console.log(ListLength(staticList));
    

      

    后记
    看懂不等于真正懂了,只有用代码实现过体会过,才能真正的掌握。


    参考资料
    [1]大话数据结构

    作者:WadeYu
    出处:http://www.cnblogs.com/wadeyu/
    本文版权归本人和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    CF G. Running Competition (NTT, 思维)
    ABC 177 F
    牛客练习赛68 D.牛牛的粉丝 (期望DP,矩阵快速幂)
    CF E
    HDU 6761 Minimum Index (字符串--Lyndon分解)
    D. GameGame (思维、博弈)
    P2533 最小圆覆盖
    P4049 [JSOI2007]合金
    P2510 [HAOI2008]下落的圆盘
    P3205 [HNOI2010]合唱队
  • 原文地址:https://www.cnblogs.com/wadeyu/p/4641375.html
Copyright © 2020-2023  润新知