Javascript模仿C语言的链表实现(增删改查),并且使用控制台输入输出

Js新手最近在研究Js数据结构,刚好看到链表实现这一块儿,觉得有些资料和自己理解的有冲突,于是借着自己以前一点点C语言的基础,用Javascript模仿了C的链表实现,并且用了process.stdin和process.stdout的控制台输入输出。祝贺新手第一次发帖。哈哈哈。

代码如下:

LinkList_node.js

  1 //节点类的构造函数
  2 function Node(element){
  3     this.element = element;
  4     this.next = null;
  5 }
  6 //链表类的构造函数
  7 function LList(){
  8     this.head = new Node("head");
  9     this.length = 0;
 10 }
 11 //查找某个位置为pos的元素并在控制台打印
 12 LList.prototype.find = function(pos){
 13     //检查边界
 14     if(pos < 0|| pos > this.length)
 15         return false;
 16
 17     var querynode = new Node();
 18     //遍历到pos位置
 19     for(var i = 0,querynode = this.head;i < pos;i++){
 20             querynode = querynode.next;
 21     }
 22     process.stdout.write(querynode.element.toString());
 23 }
 24 //在位置为pos的地方插入元素element
 25 LList.prototype.insert = function(element,pos){
 26     var newNode = new Node(element);
 27     var querynode = new Node();
 28     //检查边界
 29     if(pos < 0|| pos > this.length)
 30         return false;
 31     //插入头部
 32     if(pos == 0){
 33         newNode.next = this.head.next;
 34         this.head.next = newNode;
 35     }
 36     //插入尾部
 37     else if(pos == this.length){
 38         querynode = this.head;
 39         for(var i = 0;i < this.length;i++){
 40             querynode = querynode.next;
 41         }
 42         querynode.next = newNode;
 43         newNode.next = null;
 44     }
 45     //插入中间
 46     else{
 47         querynode = this.head;
 48         for(var i = 0;i < pos;i++){
 49             querynode = querynode.next;
 50         }
 51         newNode.next = querynode.next;
 52         querynode.next = newNode;
 53     }
 54     //链表长度加1
 55     this.length++;
 56 }
 57 //删除位置为pos的元素
 58 LList.prototype.remove = function(pos){
 59     var querynode = new Node();
 60     //遍历到pos位置的前一个元素
 61     for(var i = 0,querynode = this.head;i < pos-1;i++){
 62             querynode = querynode.next;
 63     }
 64     //将前一个元素的next指向下一个的下一个元素,也就是跳过了中间那个元素
 65     querynode.next = querynode.next.next;
 66     //链表长度减1
 67     this.length--;
 68 }
 69 //把位置为pos的元素值修改为element
 70 LList.prototype.modify = function(pos,element){
 71     //检查边界
 72     if(pos < 0|| pos > this.length)
 73         return false;
 74
 75     var querynode = new Node();
 76     //查找到pos位置
 77     for(var i = 0,querynode = this.head;i < pos;i++){
 78             querynode = querynode.next;
 79     }
 80     //修改元素值
 81     querynode.element = element;
 82 }
 83 //遍历并且输出链表元素的值
 84 LList.prototype.display = function(){
 85     var querynode = new Node();
 86     for(var i = 0,querynode = this.head;i < this.length;i++){
 87             querynode = querynode.next;
 88             //使用process.stdout从控制台输出
 89             process.stdout.write(querynode.element.toString());
 90     }
 91 }
 92 //以下是测试程序
 93 var mylist = new LList();
 94 console.log("请输入数据:");
 95 //使用process.stdin从控制台输入
 96 process.stdin.on("data",function(element){
 97     var arr = element.toString().split(",");
 98     mylist.insert(arr[0],arr[1]);
 99     mylist.insert(2,0);
100     mylist.insert(3,0);
101     mylist.insert(4,0);
102     mylist.insert(5,0);
103     console.log("链表元素为:")
104     mylist.display();
105     console.log();
106     console.log("查找位置2的元素为:")
107     mylist.find(2);
108     console.log();
109     console.log("删除位置为1:")
110     mylist.remove(1);
111     mylist.display();
112     console.log();
113     console.log("修改位置为1的元素为9:")
114     mylist.modify(2,9);
115     mylist.display();
116     console.log();
117 });

测试结果如下:

从控制台输入的是字符串"1,0"

时间: 2024-12-05 12:33:47

Javascript模仿C语言的链表实现(增删改查),并且使用控制台输入输出的相关文章

【C】利用单链表数据结构实现通讯录,链表的增删改查

C语言中实现链表,是需要利用到C语言中比较难的结构体与指针才能实现. 结构体中放一个指向后接节点的指针与每一个结点应该存放的信息. 下面做一个命令行的通讯录来说明链表的增删改查这个问题. 一开始让用户输入链表,按1可以输出,按3可以删除. 可以修改: 可以插入. 按0则可以退出: 代码如下: #include<stdio.h> #include<stdlib.h> typedef struct Linklist{ char name[10];//存放名字 char num[10];

数据结构 线性结构(数组[列表] ,链表 单链表的增删改查**, 线性结构的应用 队列 栈[函数的调用**]),非线性结构 树

数据结构 参考:http://lupython.gitee.io/ 线性结构 就是能够用一根线串起来的数据结构 数组 (列表) 问:申请数组的前提条件是啥? a[12]?内存需要满足的条件? 答:内存必须有一块连续的内存空间 int a[7] : 声明一个数组,这个数组的数组名是 a, 数组的大小是 7, 数组元素的类型是整型. int a[7] = array(1,2,3,4,5,6,7) 问:如何申请内存? 答:C,C++语言,申请:mallco (28).释放:free(28) 问:int

Java描述数据结构之链表的增删改查

链表是一种常见的基础数据结构,它是一种线性表,但在内存中它并不是顺序存储的,它是以链式进行存储的,每一个节点里存放的是下一个节点的"指针".在Java中的数据分为引用数据类型和基础数据类型,在Java中不存在指针的概念,但是对于链表而言的指针,指的就是引用数据类型的地址. 链表和数组都是线性的数据结构,对于数组而言其长度是固定的,由于在内存中其是连续的,因此更适合做查找与遍历,而链表在内存中是并不是顺序存储的,但是由于其是通过"指针"构成的,因此在插入.删除时比较数

注释最全的C语言链表的增删改查

1 //这是C语言的写法,但会报错,原因是len(当前的节点长度) 2 //无法在insert(插入)和deleted(删除)之后改变 3 //不能使用delete是因为delete是C++中的一个运算符 4 //最终我把改程序用C++写了一遍,运用引用将len的真实值改变了 5 #include <stdio.h> 6 #include <stdlib.h> 7 typedef int ElementType; 8 typedef struct node { 9 ElementT

C++链表,增删改查

// //  main.c //  homework_linkList // //  Created by jiumiao on 15/7/23. //  Copyright (c) 2015年 jiumiao. All rights reserved. // #include <stdio.h> #include <stdlib.h> typedef struct _NPC{ char name[20]; int attack; int hp; }NPC; typedef str

不带头结点的链表的增删改查

这两天都在学习数据结构中的链表操作,觉得有很多东西想跟大家分享,通常写链表一般会创建一个带头结点的链表,带头结点链表非常容易的进行链表的遍历,而不带头结点的链表,一马虎就会指错,所以在这里跟大家分享下我进行没有头结点的创建时的心得! 1.创建无头结点链表(头插) 2.删除中间节点(不是第一个也不是最后一个) 1 #include<stdio.h> 2 #include<malloc.h> 3 typedef char ElemType; 4 typedef struct node

js 创建链表(增删改查)

话说面试又失败了,今年真是坎坷的一年,女朋友跑了,工作不顺,家里催婚,大学刚毕业,大公司不要.在这个没钱没人的年纪,有点小绝望.不多说直接上代码: /*======定义结构======*/ var node=function(element){ this.element=element this.next=null } var linkedList=function(){ this.head=new node("head") this.find=find this.insert=ins

用内部类实现链表的增删改查

public class 链表{ public static void main(String[] args){ NodeManager nm = new NodeManager(); System.out.println("---------------add---------------"); nm.add(5); nm.add(4); nm.add(3); nm.add(2); nm.add(1); nm.add(0); nm.print(); System.out.printl

Java 创建链表,增删改查

项目结构: Node.java: package linkedList; public class Node { int data; Node next; public Node(int data) { this.data = data; this.next = null; } } LinkedList.java: package linkedList; public class LinkedList { private Node first; //指向第一个节点(默认为null) privat