-
定义:列表是一组有序的数据。每个列表中的数据项称为元素。在JavaScript中,列表中的元素可以是任意数据类型。列表中可以保存多少元素并没有事先限定,实际使用时元素的数量受到程序内存的限制。
-
列表的抽象数据类型定义
属性 含义 listSize(属性) 列表的元素个数 pos(属性) 列表的当前位置 length(属性) 返回列表中元素的个数 clear(方法) 清空列表中所有元素 toString(方法) 返回列表的字符串形式 getElement(方法) 返回当前元素的位置 insert(方法) 在现有元素后插入新元素 append(方法) 在列表的末尾添加新元素 remove(方法) 从列表中删除元素 front(方法) 将列表当前位置设移动到第一个元素 end(方法) 将列表的当前位置移动到最后一个元素 prev(方法) 将当前位置后移一位 next(方法) 将当前位置前移一位 hasNext(方法) 判断后一位 hasPrev(方法) 判断前一位 currPos(方法) 返回列表当前位置 moveTo(方法) 将当前位置移动到指定位置 -
具体实现
function List() { this.listSize = 0; this.pos = 0; this.dataStore = []; //保存数组元素 this.length = function() { return this.listSize; } this.clear = function() { delete this.dataStore; this.dataStore.length = 0; this.listSize = this.pos = 0; } this.toString = function() { return this.dataStore } this.getElement = function() { return this.dataStore[this.pos] } // 辅助方法 查找元素位置 this.find = function() { for(var i = 0 ; i < this.dataStore.length; i++) { if(this.dataStore[i] === element) { return i; } } return -1; } this.insert = function(element, after) { var insertPos = this.find(after); if(insertPos > -1) { this.dataStore.splice(insertPos+1, 0, element); ++ this.listSize; return true; } return false } this.append = function(element) { this.dataStore[this.listSize++] = element; } this.remove = function(element) { var foundAt = this.find(element); if(foundAt > -1) { this.dataStore.splice(frontAt, 1); --this.listSize; return true; } return false; } /* 遍历列表 */ this.front = function() { this.pos = 0; } this.end = function() { this.pos = this.listSize - 1; } this.pre = function() { --this.pos; } this.next = function() { if(this.pos < this.listSize) { ++this.pos; } } this.currPos = function() { return this.pos; } this.moveTo = function(position) { this.pos = position; } this.hasNext = function() { return this.pos < this.listSize; } this.hasPrev = function() { return this.pos >=0; } } -
使用迭代器访问列表
使用迭代器,可以不必关心数据的内部存储方式,以实现对列表的遍历。前面提到的方法front()、end()、prev()、next()和currPos就实现了cList类的一个迭代器。for(names.front(); names.hasNext(); names.next()) { print(names.getElement()) }在for循环的一开始,将列表的当前位置设置为第一个元素。只要currPos的值小于列表的长度,就一直循环,每一次循环都调用next()方法将当前位置向前移动一位。
练习
- 增加一个向列表中插入元素的方法,该方法只在待插元素大于列表中的所有元素时才执行插入操作。这里的大于有多重含义,对于数字,它是指数值上的大小;对于字母,它是指数值上的大小;对于字母,它是指在字母表中出现的先后顺序。
// charCodeAt() 方法可返回指定位置的字符的 Unicode 编码 function insertGt (element, after) { let bool = this.dataStore.every(ele => ele.charcodeAt ? element.charcodeAt() > ele.charcodeAt() : element > ele); bool ? this.insert(element, after) : ''; }