js数据结构中的列表
function List() {
this.listSize = 0;//列表的元素个数
this.pos = 0;//列表的当前位置
this.dataStore = []; // 初始化一个空数组来保存列表元素
this.clear = clear;
this.find = find;
this.toString = toString;
this.insert = insert;
this.append = append;
this.remove = remove;
this.front = front;
this.end = end;
this.prev = pre;
this.next = next;
this.length = length;
this.currPos = currPos;//返回列表的当前位置
this.moveTo = moveTo;//将当前位置移动到指定位置
this.getElement = getElement;
this.contains = contains;
}
function append(element){
this.dataStore[this.listSize++]=element;//this.listSize++ 先使用再赋值
}//当新元素就位后,变量 listSize 加 1。
function remove(element){
var fountAt=this.find(element);
if(fountAt){
this.dataStore.splice(fountAt,1);
--this.listSize;
return true;
}
return false;
}
function find(element) {
for(var i=0;i<this.dataStore.length;i++){
if(this.dataStore[i]==element){
return i;
}
}
return -1;
}
function length(){
return this.listSize;
}
function toString() {
return this.dataStore;
}/*严格说来,该方法返回的是一个数组,而不是一个字符串,但它的目的是为了显示列表的
当前状态,因此返回一个数组就足够了。*/
function insert(element,afterEle) {
var insertPos=this.find(afterEle);
if(insertPos){
this.dataStore.splice(insertPos+1,0,element);
++this.listSize;
return true;
}
return false;
}
/*在实现中, insert() 方法用到了 find() 方法, find() 方法会寻找传入的 after 参数在列
表中的位置,找到该位置后,使用 splice() 方法将新元素插入该位置之后,然后将变量
listSize 加 1 并返回 true ,表明插入成功。*/
function clear() {
delete this.dataStore;
this.dataStore=[];
this.listSize=this.Pos=0;
}
/*
clear() 方法使用 delete 操作符删除数组 dataStore ,接着在下一行创建一个空数组。最
后一行将 listSize 和 pos 的值设为 1,表明这是一个新的空列表。*/
function contains(element) {//判断给定值是否在列表中
for(var i=0;i<this.dataStore.length;i++){
if(this.dataset[i]==element){
return true;
}
return false;
}
}
//最后的一组方法允许用户在列表上自由移动,最后一个方法 getElement() 返回列表的当前元素:
function front() {
this.pos=0;
}
function end() {
this.pos=this.listSize-1;
}
function pre() {
if(this.pos>0){
--this.pos;
}
}
function next() {
if (this.pos<this.listSize-1){
++this.pos;
}
}
function currPos() {
return this.pos;
}
function moveTo(position) {
this.pos=position;
}
function getElement() {
return this.dataStore[this.pos];
}
/***************************************/
//用迭代器遍历列表的例子:
for(names.front(); names.currPos() < names.length(); names.next()) {
print(names.getElement());
}
/*
在 for 循环的一开始,将列表的当前位置设置为第一个元素。只要 currPos 的值小于列表
的长度,就一直循环,每一次循环都调用 next() 方法将当前位置向前移动一位。
*/
//同理,还可以从后向前遍历列表,代码如下:
for(names.end(); names.currPos() >= 0; names.prev()) {
print(names.getElement());
}
测试代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="List.js"></script>
<script>
var names = new List();
names.append("AAA");
names.append("BBB");
names.append("CCC");
console.log(names.toString());//"AAA", "BBB", "CCC"]
names.remove("BBB");
console.log(names.toString());//["AAA", "CCC"]
var names = new List();
names.append("AAA");
names.append("BBB");
names.append("CCC");
names.append("DDD");
names.append("EEE");
names.append("FFF");
// 现在移动到列表中的第一个元素并且显示它:
names.front();
console.log(names.getElement()); // 显示 AAA
//接下来向前移动一个单位并且显示它:
names.next();
console.log(names.getElement()); // 显示 BBB
//现在,让我们先向前移动两次,然后向后移动一次,显示出当前元素,看看 prev() 方法的工作原理:
names.next();//CCC
names.next();//DDD
names.prev();//CCC
console.log(names.getElement()); // 显示 CCC
//上述代码段展示的这些行为实际上是迭代器的概念,这也是接下来要讨论的内容。
</script>
</head>
<body>
</body>
</html>