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.hasNext = hasNext; this.hasPrev = hasPrev; this.length = length; this.currPos = currPos; this.moveTo = moveTo; this.getElement = getElement; this.contains = contains; this.appendWhenBig = appendWhenBig; this.appendWhenSmall = appendWhenSmall; } function append(element) { // 元素追加后,listSize 自增 this.dataStore[this.listSize++] = element; } function find(element) { for (let i = 0; i < this.dataStore.length; i++) { if (this.dataStore[i] === element) { return i; } } return -1; } function remove(element) { const 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) { const insertPos = this.find(after); if (insertPos > -1) { this.dataStore.splice(after, 0, element); ++this.listSize; return true; } return false; } function clear() { delete this.dataStore; this.dataStore.length = 0; this.listSize = this.pos = 0; } function contains(element) { for (let 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() { --this.pos; } function next() { if (this.pos < this.listSize) { this.pos++; } } function currPos() { return this.pos; } function moveTo(position) { this.pos = position; } function getElement() { return this.dataStore[this.pos]; } function hasNext() { return this.pos < this.listSize; } function hasPrev() { return this.pos >= 0; } function appendWhenBig(element) { let flag = true; for (this.front(); this.hasNext(); this.next()) { if (this.getElement() > element) { flag = false; } } if (flag) { this.append(element); } } function appendWhenSmall(element) { let flag = true; for (this.front(); this.hasNext(); this.next()) { if (this.getElement() < element) { flag = false; } } if (flag) { this.append(element); } } function displayList(list) { for (list.front(); list.currPos() < list.length(); list.next()) { console.log(list.getElement()); } } function Customer(name, movie) { this.name = name; this.movie = movie; } function checkout(name, movie, movieList, customerList) { if (movieList.contains(movie)) { const c = new Customer(name, movie); customerList.append(c); movieList.remove(movie); } else { console.log(movie + ' is not available.'); } } const movies = ['大室家 亲爱的姐妹们', '紫罗兰永恒花园', '牵牛花与加濑同学。', '利兹与青鸟', '摇曳百合 夏日时光!']; const movieList = new List(); const customers = new List(); for (let i = 0; i < movies.length; i++) { movieList.append(movies[i]); } console.log('Available moviews: \n'); displayList(movieList); const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.question('Enter your name: ', (name) => { rl.question('What movie would you like?', (movie) => { checkout(name, movie, movieList, customers); console.log('Customer Rentals: '); displayList(customers); console.log('Movies Now Available'); displayList(movieList); rl.close(); }) })