设计列表的数据结构,需要明确给出列表的定义:
- 列表应该具有那些属性
- 列表具有哪些操作方法
列表是一组有序的书,每个列表中的数据项称为元素。在js中链表的每个元素可以是任意类型,可以保存和使用的元素数量没有固定的限制,只和内存大小有关。如下介绍链表的抽象数据类型定义:
- listSize(属性) : 列表元素的个数。
- pos(属性) : 列表的当前位置
- length(属性) : 列表中元素的个数
- clear (方法) : 清空列表中的所有元素
- toString(方法): 放回列表的字符串形式
- getElement(方法):返回当前位置的元素
- inset(方法) : 在现有元素后面插入新元素
- append(方法):在列表末尾添加新元素
- remover(方法):从列表中删除元素
- front(方法) :将列表的当前位置移动大第一个元素
- end(方法) :将列表的当前位置移动到最后一个元素
- pre(方法) : 将当前位置前移一位
- next(方法) :将当前位置后移一位
- currPos(方法) : 返回列表的当前位置
- moveTo(方法) : 将当前位置移动到指定位置
下面看具体的构造函数:
//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.remover = remover;
this.front = front;
this.end = end;
this.prev = prev;
this.next = next;
this.length = length;
this.currPos = currPos;
this.moveTo = moveTo;
this.getElement = getElement;
this.length = length;
this.contains = contains;
}
//在列表末尾添加一个元素
function append ( element ) {
this.dataStore[ this.listSize++ ] = element
}
//在列表中查找到目标元素
function find ( element ) {
for ( var i = 0 ; i < this.dataStore.length; i ++ ) {
if( element === this.dataStore[ i ] ) {
return i ;
}
}
return -1;
}
//从列表中删除目标元素
function remover ( element ) {
var foundAt = this.find( element );
if( foundAt > -1 ) {
this.dataStore.splice( foundAt , 1 );
--this.listSize;
return true;
}
return false;
}
function length () {
return this.listSize;
}
function toString () {
return this.dataStore;
}
function insert ( element , after) {
var insertPos = this.find( after );
if( insertPos > -1 ) {
this.dataStore.splice( insertPos + 1 , 0 , element );
++ this.listSize;
return true;
}
return false
}
function clear () {
delete this.dataStore;
this.dataStore = [];
this.listSize = this.length = 0;
}
function contains ( element ) {
for ( var i = 0 ; i < this.dataStore.length ; i ++ ) {
if ( this.dataStore[ i ] === element ) {
return true;
}
}
return false;
}
function front () {
this.pos = 0;
}
function end () {
this.pos=this.listSize-1;
}
function prev() {
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());
}