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

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

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

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

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

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

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

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

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

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

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

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

#Add student into the list by score.
function InsertStudent($linkedList)
{$score = Read-Host "Type in the score of the student"$score = [int]$score$currentNode = $linkedList.First$flag = $truewhile(($currentNode -ne $null) -and ($flag -eq $true)){if($currentNode.Value.Score -ge $score){$currentNode = $currentNode.Next}else{$name = Read-Host "Type in the name of the student"$linkedList.AddBefore($currentNode, @{Name=$name;Score=$score})$flag = $false}}
}

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

Write-Host "---Now begin initial---" -ForegroundColor green
Initial $linkedList
Write-Host "---Now begin insert---" -ForegroundColor green
InsertStudent $linkedList
Write-Host "---Result---" -ForegroundColor green
$linkedList

运行结果如下:

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

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

$linkedList.First

某一结点的下一节点——

$node.Next

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

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

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

链表——PowerShell版相关推荐

  1. java带头结点空单链表_Java版带头结点单链表的实现

    Java版带头结点单链表的实现 Java版带头结点单链表的实现 package dsr; public interface IList { public void clear();//8 public ...

  2. 队列——PowerShell版

    继续读啊哈磊<啊哈!算法>感悟系列--队列 地铁售票处排队,先来的人先到队首先买完先走,后来的人排在队尾等候后买完后走. 想买票,必须排在队尾:买完票,只能从队首离开. 这种先进先出(Fi ...

  3. 数据结构与算法之链表(Java版)

    文章目录 链表 单链表完成添加的遍历 按照顺序添加英雄 解题思路: 代码实现: 单链表的修改 解题思路: 代码实现: 单链表的删除: 解题思路: 代码实现: 实战演练 找出单链表中有效节点的个数 查找 ...

  4. 【leetcode刷题】16.环形链表——Java版

    ⭐欢迎订阅<leetcode>专栏,每日一题,每天进步⭐ 使用快慢指针,若指针相遇则判断有环 --leetcode此题热评 前言 哈喽,大家好,我是一条. 糊涂算法,难得糊涂 Questi ...

  5. vs2017python如何打包exe_VS2017项目程序打包成.msi或者.exe

    VS2017项目程序打包成.msi或者.exe 1.安装打包插件:Microsoft Visual Studio 2017 Installer Projects 打开vs2017 ,选择 工具 --& ...

  6. [网络安全提高篇] 一一五.Powershell恶意代码检测 (3)Token关键词自动提取

    "网络安全提高班"新的100篇文章即将开启,包括Web渗透.内网渗透.靶场搭建.CVE复现.攻击溯源.实战及CTF总结,它将更加聚焦,更加深入,也是作者的慢慢成长史.换专业确实挺难 ...

  7. Python版插入排序算法

    问题描述:在插入排序算法中,把所有元素分为前面的已排序序列和后面的未排序序列两部分,每次处理未排序序列中的第一个元素,将其插入到前面已排序序列中的合适位置,从而不停地扩大已排序序列并缩小未排序序列,直 ...

  8. 环形链表【手绘漫画】面试必考之双指针(LeetCode 141)

    文章目录 图解算法与数据结构 1.前言 2.实例 3.正文 4.代码 图解算法与数据结构 1.前言 今天开始的是双指针! 下面一起来看看吧!!! 让我们从一个经典问题开始: 环形链表进阶版[手绘漫画] ...

  9. 防止电脑锁屏java版

    prevent-screen-lock(阻止锁屏小程序) https://gitee.com/zeeus/prevent-screen-lock background 域策略的电脑有时候会写死锁屏时间 ...

最新文章

  1. [Hibernate] - Annotations - One To One
  2. 哀悼!华人著名计算机科学家刘炯朗逝世,图灵奖得主姚期智为其得意门生
  3. 奥运开幕了 您给开幕式和火炬点火仪式打几分?
  4. Controller FioriTest.view.LineItem couldn't be instantiated
  5. 算法:输入一个链表,输出该链表中倒数第k个结点。
  6. SQLAlchemy 中的 Session、sessionmaker、scoped_session
  7. Web 开发中 20 个很有用的 CSS 库
  8. LibreOffice、OpenOffice 漏洞可导致黑客欺骗已签名文档
  9. sql server的标识种子列
  10. java还原混淆代码_飘云阁安全论坛如何还原混淆加密的JAVA代码 - Powered by Discuz!...
  11. 计算机网络技术毕业生实习报告_计算机毕业实习报告8篇完美版
  12. 51单片机之中断的实现过程
  13. Vue最全知识点集合
  14. python评价回归模型指标:决定系数R2,相关系数R,均方误差MSE,均方根误差RMSE
  15. autocad ios 虚线_autocad中画箭头、虚线绘制方法介绍
  16. 使用FontCreator工具创建字体符号导入arcmap
  17. 洛谷:P哥的桶(线段树 + 线性基)
  18. 通往财富自由之路详细笔记(16)
  19. POJ 1877 Flooded! G++
  20. 1955年至2020年的国家GDP数据可视化-基于Pandas,Seaborn

热门文章

  1. glutSwapBuffers函数用法
  2. CCF-CSP 201903-1 小中大(C++满分代码)
  3. 无法获取到图片的宽高
  4. 排序的稳定性(概念明晰)
  5. android中跨进程通讯的4种方式
  6. 把struts2的struts.xml配置文件分解成多个配置文件
  7. Android Memory Management
  8. C# 命令行编译器详解
  9. for 循环迭代变量
  10. golang中的定时器