码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-07-12 20:20:08      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:

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

静态链表

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

技术分享

 

技术分享
  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]大话数据结构

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

标签:

原文地址:http://www.cnblogs.com/wadeyu/p/4641375.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!