前言
数据结构学习,发现坚持下来比较难,本次学习与上次学习间隔了几个月,不管怎样还是要强迫自己坚持下来。
静态链表
用数组模拟链式结构的线性表,对于没有指针的编程语言,只能使用这种方式来模拟。这是大师们想出来的实现方法,体会大师们的编程思路,站在大师们的肩膀上解决一个又一个的难题。每个节点包含一个游标(数组数字索引),用于指向下个节点,所以静态链表也称为游标链表。规定数组第一个元素为备用链表(未被使用的数组游标,静态链表初始化时,会生成备用链表)的头节点,数组最后一个元素为链表的头节点。当需要插入一个元素时,首先从备用链表取一个可用游标存储当前节点,备用链表头节点指向下个可用的空间,剩下操作跟链式线性表类似。当删除元素时,被删除元素的游标会被回收到备用链表,备用链表的头节点指向回收节点,被回收的节点指向备用链表头节点原来指向的节点,剩下操作跟链式线性表类似。
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 };
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]大话数据结构