链表是由一系列节点串连起来组成的,每一个节点包括数值部分和指针部分,上一节点的指针部分指向下一节点的数值部分所在的位置。

在C语言中我们有两种方式来定义链表——

1、定义结构体:来表示链表中的节点,节点中包含数值部分和指针部分。将一个节点的指针部分指向另一个节点的数值部分,这两个结构体之间就形成了一个链表。

2、不定义结构体:用一个数组来表示链表的数值部分,用另外一个数组来表示每个数值所对应的指针部分。

在PowerShell中定义一个链表更加简洁:

  1. $linkedList = New-Object System.Collections.Generic.LinkedList[HashTable]

其中HashTable相当于我们在C语言中定义的结构体中的数值部分,而对于链表中数值进行的操作都被封装成了一系列链表对象的方法。

现在我们举一个现实生活中的例子——

考试结束,老师排好了一个成绩单(按成绩从高到低),现在来了个插班生,我们要把这个插班生的考试成绩插入到本班的成绩单中。

首先我们写一个方法,将排好的成绩单录入到一个链表中:

  1. #Initial the students' scores.
  2. function Initial($linkedList){
  3. $count = Read-Host "Type in the students' number"
  4. For($i=1; $i -le [int]$count; $i++){
  5. $tip = "This is the NO."+$i+" student"
  6. Write-Host $tip -ForegroundColor green
  7. $name = Read-Host "Type in the name"
  8. $score = Read-Host "Typen in the score"
  9. $linkedList.AddLast(@{Name=$name;Score=[int]$score})
  10. }
  11. }

然后我们写一个方法,将插班生的成绩插入到已排好序的成绩单链表中:

  1. #Add student into the list by score.
  2. function InsertStudent($linkedList)
  3. {
  4. $score = Read-Host "Type in the score of the student"
  5. $score = [int]$score
  6. $currentNode = $linkedList.First
  7. $flag = $true
  8. while(($currentNode -ne $null) -and ($flag -eq $true))
  9. {
  10. if($currentNode.Value.Score -ge $score)
  11. {
  12. $currentNode = $currentNode.Next
  13. }else
  14. {
  15. $name = Read-Host "Type in the name of the student"
  16. $linkedList.AddBefore($currentNode, @{Name=$name;Score=$score})
  17. $flag = $false
  18. }
  19. }
  20. }

最后我们来运行这两个方法,对成绩单链表进行初始化和插入操作,并显示插入数据后的链表:

  1. Write-Host "---Now begin initial---" -ForegroundColor green
  2. Initial $linkedList
  3. Write-Host "---Now begin insert---" -ForegroundColor green
  4. InsertStudent $linkedList
  5. Write-Host "---Result---" -ForegroundColor green
  6. $linkedList

运行结果如下:

我们可以看到,我们不用再去像在C语言中一样对指针的指向进行操作,取而代之的是一系列已经封装好了的属于链表对象本身的方法和属性。比如:

链表对象的第一个节点——

  1. $linkedList.First

某一结点的下一节点——

  1. $node.Next

在链表的某一节点前插入一个节点——

  1. $linkedList.AddBefore($currentNode, @{Name=$name;Score=$score})

我们可以看到,我们只需要关注节点插入的位置(目标节点)和节点对象本身的数值部分,剩下的对指针部分的操作已经封装到方法里了。我们只需要选择指定的方法就可以完成对目标节点前后的插入等操作。PowerShell和C#都是基于.NET的,所以在方法和属性上基本都是相同的,在这里附上一篇官方的关于链表的指南

链表——PowerShell版的更多相关文章

  1. C语言实现单链表-03版

    在C语言实现单链表-02版中我们只是简单的更新一下链表的组织方式: 它没有更多的更新功能,因此我们这个版本将要完成如下功能: Problem 1,搜索相关节点: 2,前插节点: 3,后追加节点: 4, ...

  2. C语言实现单链表-02版

    我们在C语言实现单链表-01版中实现的链表非常简单: 但是它对于理解单链表是非常有帮助的,至少我就是这样认为的: 简单的不能再简单的东西没那么实用,所以我们接下来要大规模的修改啦: Problem 1 ...

  3. Ladon内网渗透扫描器PowerShell版

    程序简介 Ladon一款用于大型网络渗透的多线程插件化综合扫描神器,含端口扫描.服务识别.网络资产.密码爆破.高危漏洞检测以及一键GetShell,支持批量A段/B段/C段以及跨网段扫描,支持URL. ...

  4. C语言实现单链表-04版

    前面的版本似乎没能让项目经理满意,他还希望这个链表有更多的功能: 我们接下来要解决几个比较简单的功能: Problem 1,更加友好的显示数据: 2,能够通过名字删除节点: Solution 首先我们 ...

  5. Python3玩转单链表——逆转单向链表pythonic版

    [本文出自天外归云的博客园] 链表是由节点构成的,一个指针代表一个方向,如果一个构成链表的节点都只包含一个指针,那么这个链表就是单向链表. 单向链表中的节点不光有代表方向的指针变量,也有值变量.所以我 ...

  6. [工具]法国神器mimikatz 2.1.1 一键版 & PowerShell版

    无需任何参数,运行EXE即可自动读取Windows系统密码 EXE版需要其它功能请使用原版 (参数已写死仅读密码) 结果保存于当前目录mz.log EXE https://github.com/k8g ...

  7. C语言实现单链表-01版

    单链表的应用非常广,它可以实现栈,队列等: Problem 我对学习任何东西都希望能找到尽可能简单的例子,而不是看起来好高大上的: 对链表这样简答的数据结构,有些书也是写得太过“完美”啦: 初学者很难 ...

  8. 栈——PowerShell版

    上一篇讲过队列(queue),队列就像是居民楼里的垃圾管道,从楼道的垃圾管道的入口处将垃圾扔进去,清洁工会从一楼垃圾管道的出口处将垃圾拿走.每一层的垃圾通道入口与一楼的垃圾管道出口之间都形成了一个队列 ...

  9. 批量备份数据库脚本(PowerShell版)

    开始 昨天备份一个数据库拿来测试,发现备份后的文件非常大.后来去检查下使用的备份脚本,原来之前的备份脚本没有压缩功能. 现把之前的备份脚本修改下,支持压缩备份,和支持仅复制备份(CopyOnly). ...

随机推荐

  1. 王家林 大数据Spark超经典视频链接全集[转]

    压缩过的大数据Spark蘑菇云行动前置课程视频百度云分享链接 链接:http://pan.baidu.com/s/1cFqjQu SCALA专辑 Scala深入浅出经典视频 链接:http://pan ...

  2. [原创]java WEB学习笔记49:文件上传基础,基于表单的文件上传,使用fileuoload 组件

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  3. [转]关于安装hadoop中出现的的 $HADOOP_HOME is deprecated 的解决方法

    当前用户的.bash_profile在/home/用户/下,系统的.bash_profile在/etc/skel目录下; 默认可能是隐藏的:有人会问了,隐藏的我怎么打开它,一个简单的办法,直接使用vi ...

  4. 判断java中两个对象是否相等

    java中的基本数据类型判断是否相等,直接使用"=="就行了,相等返回true,否则,返回false. 但是java中的引用类型的对象比较变态,假设有两个引用对象obj1,obj2 ...

  5. CCSprite的使用方法大全

    一.精灵创建及初始化 1.从图片文件创建: CCSprite *sprite = [CCSprite spriteWithFile:@"ImageFileName.png"]; 默 ...

  6. bean在容器上的生命周期

            初始化两种方法:         1,使用init-method属性指定那个方法在bean依赖关系设置好后自动执行.         2,实现initializingBean接口 实现 ...

  7. 夺命雷公狗—angularjs—22—bind改指向和传参方式

    在angularjs中的传参的jquery的方式是极度相似的噢,而且还可以通过bind来改变指向 <!DOCTYPE html> <html lang="en" ...

  8. oracle中dual表的使用

    dual表是一个虚拟表,用来和select语句一起使用.1.查看当前用户select  user from dual2.用来调用系统函数select to_char(sysdate,'yyyy-mm- ...

  9. iOS证书申请详细流程

    一.事前准备 1.1 准备苹果帐号 首先您需要有一个苹果的开发者帐号,一个mac系统.如果没有帐号可以打开申请加入苹果的开发者计划.如何申请网上有详细的介绍,在此不多做介绍. 如果您已经有了一个帐号, ...

  10. linux设备驱动归纳总结(三):6.poll和sellct【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-61749.html linux设备驱动归纳总结(三):6.poll和sellct xxxxxxxxxx ...