一、前言
1、实验目的:
- 熟悉JavaScript语法
2、实验内容:
所有的代码存放在js文件中,并通过node.js来运行。
制作一个链表list,实现链表的加入,删除,查询等操作。同时把该数据保存为json格式的文件;并能从文件读取到内存中;
二、环境
- 操作系统: Windows 10 X64
- 编辑器:VScode
三、实验步骤
- 配置环境:下载并安装Node.js,点击vscode中“调试”按钮,打开launch.json文件(或者使用Ctrl+Shift+P输入launch.json),在里面添加以下代码
"version": "0.2.0",
"configurations": [{
"name": "Launch",
"type": "node",
"request": "launch",
"program": "${workspaceRoot}/1.js",
"stopOnEntry": false,
"args": [],
"cwd": "${workspaceRoot}",
"runtimeExecutable": null,
"runtimeArgs": ["--nolazy"],
"env": { "NODE_ENV": "development" },
"externalConsole": false,
"preLaunchTask": "",
"sourceMaps": false,
"outDir": null
},
{
"name": "Attach",
"type": "node",
"request": "attach",
"port": 5858
}
]
- 包含两个类,一个是 Node 类用来表示节点,另一个事 LinkedList 类提供插入节点、删除节点等一些操作。
(1)Node类中包含数据域和指针域: element 用来存储节点的数据,next 是指向下一个节点的指针,代码如下:
function Node(element)
{
this.element = element; //数据域
this.next = null; //指针域
}
(2)LinkedList类提供了对链表进行操作的方法,包括查询,插入,删除节点等。
function LList () {//链表类
this.head = new Node( 'head' ); //头节点
this.find = find; //查找节点
this.insert = insert; //插入节点
this.remove = remove; //删除节点
this.findPrev = findPrev; //查找前一个节点
this.display = display; //显示链表
}
- 查找 遍历链表,查找给定的数据。创建一个新节点,将链表的头节点赋给这个新创建的节点,然后在链表上循环,如果当前节点的 element 属性和我们要找的信息不符,就将当前节点移动到下一个节点,如果查找成功,该方法返回包含该数据的节点;否则,就会返回null。
function find ( item ) {//查找给定节点
var currNode = this.head;
while ( currNode.element != item ){
currNode = currNode.next;
}
return currNode;
}
4.插入 将新节点的 next 属性设置为后面节点的 next 属性对应的值,然后设置后面节点的 next 属性指向新的节点。
function insert ( newElement , item ) {//插入节点
var newNode = new Node( newElement );
var currNode = this.find( item );
newNode.next = currNode.next;
currNode.next = newNode;
}
- 删除 从链表中删除节点时,先要找待删除节点的前一个节点,修改它的 next 属性,使其指向待删除节点的下一个节点。先定义一个 findPrevious 方法遍历链表,检查每一个节点的下一个节点是否存储待删除的数据。
function findPrev( item ) {//查找要删除节点的前一个节点
var currNode = this.head;
while ( !( currNode.next == null) && ( currNode.next.element != item )){
currNode = currNode.next;
}
return currNode;
}
function remove ( item ) {//删除节点
var prevNode = this.findPrev( item );
if( !( prevNode.next == null ) ){
prevNode.next = prevNode.next.next;
}
}
- 显示 为了能知道自己做的是否正确,添加显示
function display () {//显示链表元素
var currNode = this.head;
while ( !(currNode.next == null) ){
console.log( currNode.next.element );
currNode = currNode.next;
}
}
- 这里是一个number链表,要insert “1”“2”“3”“4”“5”,remove “2”
var number = new LList();
number.insert('1', 'head');
number.insert('2' , '1');
number.insert('3' , '2');
number.insert('4' , '3');
number.insert('5' , '4');
number.remove('2')
number.display();
- 把该数据保存为json格式的文件,并能从文件读取到内存中
var fs = require('fs');//文件模块
var path = require('path');//系统路径
var content = JSON.stringify(number);//把数据对象转换为json格式字符串
var file = path.join(__dirname, 'test.json');//指定创建目录及文件名称
//写入文件
fs.writeFile(file,content,
function(err)
{
if(err)
{
return console.log(err);
}
console.log('创建成功,地址为 '+file);
}
);
console.log('start sync read'); //同步读取开始
var date = fs.readFileSync('test.json','utf-8');
console.log('end sync read'); //同步读取结束
9.调试 运行成功,截图如下:
四、总结
- 多实践,多动手