《数据结构与算法JavaScript描述》列表(学习笔记C03)

本文介绍了一个用JavaScript实现的列表类,包括列表的创建、元素的添加、查找、删除等操作,以及如何遍历列表和使用迭代器。文章还提供了详细的代码示例,展示了列表类的使用方法。

相关概念

1.列表是一组有序的数据。
2.每个列表中的数据项称为元素。
3.在 JavaScript 中,列表中的元素可以是任意数据类型。
4.列表中可以保存多少元素并没有事先限定,实际使用时元素的数量受到程序内存的限制。
5.不包含任何元素的列表称为空列表。
6.列表中包含元素的个数称为列表的 length。
7.底层储存数据的数据结构是数组。

代码

// 实现列表类
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 = prev // 讲当前位置后移一位
    this.next = next // 将当前位置前移一位
    this.length = length // 返回列表元素个数                **返回值**
    this.currPos = currPos // 返回列表的当前位置            **返回值**
    this.moveTo = moveTo // 将当前位置移动到指定位置
    this.getElement = getElement // 返回当前位置的元素      **返回值**
    this.length = length
    this.contains = contains
}

// append
// 在列表末尾添加element元素
function append (element) {
    this.dataStore[this.listSize++] = element
}

// find
// 找到element元素返回位置i否则返回-1
function find(element) {
    for (var i=0; i<this.dataStore.length; ++i) {
        if (this.dataStore[i] == element) {
            return i
        }
    }
    return -1
}

// remove
// 删除element圆度 并更改列表长度 最后返回删除成功与否的布尔值
function remove (element) {
    var foundAt = this.find(element)
    if (foundAt > -1) {
        this.dataStore.splice(foundAt, 1)
        --this.listSize
        return true
    }
    return false
}

// length
// 返回列表的长度
function length () {
    return this.listSize
}

// toString
// 直接返回字符串形式
function toString () {
    return this.dataStore
}

// 测试代码一
var names = new List()
names.append('xx1')
names.append('xx2')
names.append('xx3')
console.log('第一个列表',names.toString()) // [xx1,xx2,xx3]
names.remove('xx2')
console.log( '第二个列表', names.toString()) // [xx1,xx3]

// insert
// 插入element元素至after后面 成功返回true 失败返回false
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
}

// clear
// 清除元素 并将列表长度和当前位置设为0
function clear () {
    delete this.dataStore
    this.dataStore = []
    this.listSize = this.pos = 0
}

// contains
// 如果列表中包含该元素则返回true 否则返回false
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]
}

// 测试代码二
var names2 = new List()
names2.append('xx4')
names2.append('xx5')
names2.append('xx6')
names2.append('xx7')

names2.front()
console.log('front', names2.getElement()) // xx4

names2.next()
console.log('next', names2.getElement()) // xx5

names2.next()
names2.next()
names2.prev()
console.log('prev',names2.getElement()) // xx6

// 使用迭代器遍历列表(从前向后)
for(names2.front(); names2.currPos() < names2.length; names2.next()) {
    console.log('for1', names2.getElement())
}
// 使用迭代器遍历列表(从后向前)
for(names2.end(); names2.currPos() >= 0; names2.prev()) {
    console.log('for2', names2.getElement())
}

// 读取文件
function createArr(file) {
    // 以换行符分隔为数组
    var arr = read(file).split('\n')
    for(var i=0; i<arr.length; ++i){
        // 数组的每一项去空格
        arr[i] = arr[i].trim()
    }
    return arr
}

// 实例:使用列表管理影碟租赁
// 将数组movies保存到movieList数组中
var movieList = new List()
for(var i=0; i<movies.length; ++i){
    movieList.append(movies[i])
}

// 显示列表(原生数据类型)
function displayList(list) {
    for(list.front(); list.currPos() < list.length; list.next()) {
        console.log(list.getElement())
    }
}

// 显示列表(自定义类型)
function displayList(list) {
    for(list.front(); list.currPos() < list.length(); list.next()){
        if (list.getElement() instanceof Customer) {
            console.log(list.getElement()['name'] + ', ' + list.getElement()['movie'])
        } else {
            console.log(list.getElement())
        }
    }
}

// 创建客户列表
var customers = new List()

// customer对象的构造函数
function Customer(name, movie) {
    this.name = name
    this.movie = movie
}

// 客户检出电影的函数
function checkOut(name, movie, filmList, customerList) {
    if (movieList.contains(movie)) {
        var c = new Customer(name, movie)
        customerList.append(c)
        filmList.remove(movie)
    } else {
        console.log(movie + 'is not available.')
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值