列表

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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值