Javascript编程训练

1. 实验准备

2. 实验内容

  • 制作一个链表list,实现链表的加入,删除,查询等操作。同时把该数据保存为json格式的文件;并能从文件读取到内存中;

3.实验环境

  • 所有的代码存放在js文件中,并通过node.js来运行。
  • 安装和运行:http://nodejs.cn/ 下载node.js

4.实验解析

1、基本概念

1、链表定义
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O(1)。

链表.png

在链表中有一个头指针变量,图中head表示的就是头指针,这个指针变量保存一个地址。从图中的箭头可以看到该地址为一个变量的地址,也就是说头指针指向一个变量。这个变量称为元素,在链表中每一个元素包括两个部分:数据部分和指针部分。数据部分用来存放元素所包含的数据,而指针部分用来指向下一个元素。最后一个元素指针指向NULL,表示指向的地址为空。从图1可以看到,head头结点指向第一个元素,第一个元素中的指针又指向第二个元素,第二个元素的指针又指向第三个元素的地址,第三个元素的指针就指向为空。
2、插入操作
链表的插入操作可以在链表的头指针位置进行(链表头插入节点过程.jpg),也可以在某个结点的位置进行,或者可以像创建结构时在链表的后面添加结点(链表尾插入节点过程.jpg)。这三种插入操作的思想都是一样的。
链表尾插入节点过程.png

链表头插入节点过程.png

3、删除操作
通过图4可以发现要删除一个结点,首先要找到这个结点的位置,例如图中的NO2结点。然后将NO1结点的指针指向NO3结点,最后将NO2结点的内存空间释放掉,这样就完成了结点的删除操作。
删除节点.png

2、Javascript代码

1、Node类用来表示节点

function Node(element) {
    this.element = element;
     this.next = null;//next用来保存指向下一个节点的链接
}

2、LinkedList类提供插入节点、删除节点、显示列表元素的方法

function LinkedList() {
     this.head = new Node('head');
     this.find = find ;  //在列表中查找给定的值
     this.findout = findout ;  //查找给定值
     this.insert = insert ;  //插入节点
     this.display = display;
     this.remove = remove;   // 删除节点
     this.findPrevious = findPrevious;
}

3、遍历链表,查找给定数据

function find(item) {
     var currNode = this.head;
     while (currNode.element != item) {
          currNode = currNode.next;//从当前节点移动到下一个节点
     }
    return currNode;
}

4、插入新节点

function insert(newElement, item) {
    var newNode = new Node(newElement);
    var current = this.find(item);
    newNode.next = current.next;
    current.next = newNode;
}

5、查找给定值

function findout(item){
     var i=0;
     var currNode = this.head;
     while ( currNode.element != item ){
         currNode = currNode.next;
         i++;
     }
     console.log(currNode.element,"位于第",i,"个");
     return currNode;
}

6、找到待删除节点的前驱

function findPrevious(item) {
     var currNode = this.head;
     while (!(currNode.next == null) && (currNode.next.element != item)) {
         currNode = currNode.next;
     }
     return currNode;
}

7、从链表中删除节点

function remove(item) {
      var prevNode = this.findPrevious(item);
      if (!(prevNode.next == null)) {
          prevNode.next = prevNode.next.next;
      }
}

8、显示列表中的元素

function display() {
      var currNode = this.head;
     while (!(currNode.next == null)) {
          console.log(currNode.next.element);
          currNode = currNode.next;
    }
}

9、主程序

var names = new LinkedList();
names.insert('Claire', 'head');
names.insert('Nancy', 'Claire');
names.insert('Joe', 'Nancy');
names.display();
console.log('--------------------------------');
console.log("在Claire后面插入Cherry后的链表:");
names.insert('Cherry' , 'Claire');
names.display();
console.log("寻找Nancy:");
names.findout('Nancy');
console.log("删除Joe之后的链表:");
names.remove('Joe');
names.display();

运行结果:

运行结果.png

3、js与json的转换

1、关于JSON
JSON是JavaScript Object Notation的缩写,它是一种数据交换格式。

  • 在JSON中,一共就这么几种数据类型:

number:和JavaScript的number完全一致;
boolean:就是JavaScript的true或false;
string:就是JavaScript的string;
null:就是JavaScript的null;
array:就是JavaScript的Array表示方式——[];
object:就是JavaScript的{ ... }表示方式。
以及上面的任意组合。

  • JSON还定死了字符集必须是UTF-8,表示多语言就没有问题了。为了统一解析,JSON的字符串规定必须用双引号"",Object的键也必须用双引号""。
  • 由于JSON非常简单,很快就风靡Web世界,并且成为ECMA标准。几乎所有编程语言都有解析JSON的库,而在JavaScript中,我们可以直接使用JSON,因为JavaScript内置了JSON的解析。
  • 把任何JavaScript对象变成JSON,就是把这个对象序列化成一个JSON格式的字符串,这样才能够通过网络传递给其他计算机。
  • 如果我们收到一个JSON格式的字符串,只需要把它反序列化成一个JavaScript对象,就可以在JavaScript中直接使用这个对象了。
    2、把数据保存为.json格式的文件(写入文件)
var fs=require('fs');//创建文件
var path=require('path');//系统路径模块
//把data对象转换为json格式字符串
var content=JSON.stringify(names);
//指定创建目录及文件名称,__dirname为执行当前js文件的目录
var file=path.join(__dirname,'list.json');

console.log("写入文件:");
fs.writeFile(file,content,
      function(err)
       {
           if(err)
           {
               return console.log(err);
          }
           console.log('文件创建成功,地址:'+file);
       }
);
console.log("json内容:");
console.log(content);

运行结果:

写入文件.png

3.读取文件

fs.readFile(path.join(__dirname,'list.json'),{encoding:'utf-8'},function (err,bytesRead) {
     console.log("读取文件:");
     if(err) throw err;
     console.log("读取文件_js对象:");
     console.log(JSON.parse(bytesRead));
     console.log("读取文件_json格式:");
     console.log(JSON.stringify(JSON.parse(bytesRead)));
     console.log("ReadFile Success");
}

运行结果:

读取文件.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,027评论 0 2
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 2,054评论 1 10
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,717评论 2 17
  • 一、前言 1、实验目的: 熟悉JavaScript语法 2、实验内容: 所有的代码存放在js文件中,并通过node...
    石石是石头的石阅读 420评论 0 0
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,093评论 0 3