当前位置: 首页 > news >正文

(C#)一个最简单的链表类

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一、关于C#链表

C#链表可用类LinkedList来存放。本文中的类MyLinkedList只是实现了该类的最基本的功能。C#中没有指针,但因为C#中类在赋值时传递的是地址,因此仍然可以利用这点制作一个链表。

二、结点类Node和链表类MyLinkedList代码

/// <summary>
/// 链表结点
/// </summary>
class Node
{
    //结点数据,前后结点
    public object Data;
    public Node PreviousNode;
    public Node NextNode;

    //构造函数
    public Node(object data = null)
    {
        Data = data;
        PreviousNode = null;
        NextNode = null;
    }

    //输出结点信息
    public override string ToString()
    {
        return Data.ToString();
    }
}

/// <summary>
/// 链表类
/// </summary>
class MyLinkedList
{
    //首结点、尾结点
    public Node First;
    public Node Last;

    //下一个结点、上一个结点
    public Node NextNode(Node n) { return n.NextNode; }
    public Node PreviousNode(Node n) { return n.PreviousNode; }

    //结点总数
    public int Count;

    //构造函数
    public MyLinkedList()
    {
        this.First = null;
        this.Last = null;
        Count = 0;
    }

    /// <summary>
    /// 在结点node1之后增加结点node2,如果没有该结点则在最后增加
    /// </summary>
    /// <param name="node1">结点1</param>
    /// <param name="node2">结点2</param>
    public void AddAfter(Node node1, Node node2)
    {
        //链表为空的情况
        if (First == null)
        {
            Console.WriteLine("Linked-list is null! Can not find node1(" + node1 + ")");
            return;
        }

        Node temp = First;
        do
        {
            if (temp.Data.Equals(node1.Data))
            {
                //如果node1是尾结点
                if (node1.NextNode == null)
                {
                    node2.NextNode = null;
                    node2.PreviousNode = node1;
                    node1.NextNode = node2;
                }
                else //如果node1不是尾结点
                {
                    node2.NextNode = node1.NextNode;
                    node2.PreviousNode = node1;
                    node2.NextNode.PreviousNode = node2;
                    node1.NextNode = node2; ;
                }

                Count++;
                Console.WriteLine("Node(" + node2 + "): Add Complete!");
                return;
            }

            temp = temp.NextNode;
        }
        while (temp != null);

        Console.WriteLine("Can not find node(" + node1 + "), Misson defeat");
    }

    /// <summary>
    /// 在链表尾部增加结点
    /// </summary>
    public void AddLast(Node node)
    {
        //链表为空的情况
        if (this.First == null) 
        {
            node.NextNode = null;
            node.PreviousNode = null;

            this.First = node;
            this.Last = node;
        }
        else //链表不为空的情况
        {
            Node temp = First;
            while(temp.NextNode != null)
            {
                temp = temp.NextNode;
            }

            temp.NextNode = node;
            node.PreviousNode = temp;

            Last = node;
        }

        Count++;
        Console.WriteLine("Node(" + node + "): Add Complete!");
    }

    /// <summary>
    /// 删除指定结点
    /// </summary>
    /// <param name="node">被删除结点</param>
    public void Delete(Node node)
    {
        if (Count == 0)
        {
            Console.WriteLine("Can not find node(" + node + ")");
            return;
        }

        Node temp = First;
        do
        {
            //如果数据部分匹配,则删去该结点
            if (temp.Data.Equals(node.Data))
            {
                //temp是尾结点
                if (temp.NextNode == null)
                {
                    temp.PreviousNode.NextNode = null;
                    temp = null;
                }
                else //temp不是尾结点 
                {
                    temp.PreviousNode.NextNode = temp.NextNode;
                    temp.NextNode.PreviousNode = temp.PreviousNode;
                    temp = null;
                }

                Count--;
                Console.WriteLine("Node(" + node + "): Delete Complete!");
                return;
            }

            temp = temp.NextNode;
        }
        while (temp != null);

        Console.WriteLine("Can not find node(" + node + "), Misson defeat");
    }

    /// <summary>
    /// 修改结点值
    /// </summary>
    /// <param name="node">被修改结点</param>
    /// <param name="value">结点值</param>
    public void Modify(Node node, object value)
    {
        if (Count == 0)
        {
            Console.WriteLine("Can not find node(" + node + ")");
            return;
        }

        Node temp = First;
        do
        {
            if (temp.Data.Equals(node.Data))
            {
                Console.WriteLine("Node: " + temp.Data + " → " + value.ToString());
                temp.Data = value;
                return;
            }

            temp = temp.NextNode;
        }
        while (temp != null);
    }

    /// <summary>
    /// 打印链表
    /// </summary>
    public void Print()
    {
        if (First == null)
        {
            Console.WriteLine("No nodes in this linked-list.");
            return;
        }
        else
        {
            Console.WriteLine("Print the linked-list...");
            Node temp = First;
            do
            {
                Console.WriteLine(temp.ToString());
                temp = temp.NextNode;
            }
            while (temp != null);
            Console.WriteLine("Mission Complete!");
        }
    }
}

三、Main函数的调用示例

static void Main(string[] args)
{

    MyLinkedList ll = new MyLinkedList();

    //添加三个结点 1 2(在1后) 3(在2后)
    Node n1 = new Node("node1");            
    Node n2 = new Node("node2");
    Node n3 = new Node("node3");
            
    ll.AddLast(n1);
    ll.AddLast(n2);
    ll.AddLast(n3);

    //添加三个结点 1.5(在1后) 2.5(在2后) 3.5(在3后)
    Node n1dot5 = new Node("node1dot5");
    Node n2dot5 = new Node("node2dot5");
    Node n3dot5 = new Node("node3dot5");

    ll.AddAfter(n1, n1dot5);
    ll.AddAfter(n2, n2dot5);
    ll.AddAfter(n3, n3dot5);

    Console.WriteLine("========================");

    //打印链表
    ll.Print();

    Console.WriteLine("========================");

    //删除结点 2 和 3,将结点 2.5 的值改为 "ThisNodeIsModified!"
    ll.Delete(n2);
    ll.Delete(n3);
    ll.Modify(n2dot5, "ThisNodeIsModified!");

    Console.WriteLine("========================");

    //打印链表
    ll.Print();

    Console.ReadLine();
}

四、运行结果

231936_Ftqz_1425762.png

转载于:https://my.oschina.net/Tsybius2014/blog/277453

相关文章:

  • Exchange服务器系列课程之二--Exchange Server 2003多服务器安装以及管理工具介绍
  • 【Emit基础】IL定义方法的语法详解
  • Cocos2dx 学习笔记整理----在项目中使用图片(三)
  • inittab文件解析
  • notes
  • Windows下如何使用GCC
  • UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position xxx ordinal
  • cxGrid, 和AfterScroll
  • Reset the default deployment target in Windows Phone Developer Tools
  • DataTable行列转换
  • html的a标签display:block之后文字竖直居中
  • 买了一个USB无线网卡
  • 一分钟制作U盘版BT3 - 有图滴儿 bt3破解教程
  • 假装
  • html与html5的一些区别
  • avalon2.2的VM生成过程
  • css属性的继承、初识值、计算值、当前值、应用值
  • FineReport中如何实现自动滚屏效果
  • Java|序列化异常StreamCorruptedException的解决方法
  • Javascript编码规范
  • SpiderData 2019年2月23日 DApp数据排行榜
  • 当SetTimeout遇到了字符串
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 前言-如何学习区块链
  • 区块链将重新定义世界
  • 如何解决微信端直接跳WAP端
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​一些不规范的GTID使用场景
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (12)Linux 常见的三种进程状态
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (动态规划)5. 最长回文子串 java解决
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (推荐)叮当——中文语音对话机器人
  • (转)EXC_BREAKPOINT僵尸错误
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .net 反编译_.net反编译的相关问题
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .Net8 Blazor 尝鲜
  • .Net程序帮助文档制作
  • .NET开源快速、强大、免费的电子表格组件
  • .Net中ListT 泛型转成DataTable、DataSet
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • [20161214]如何确定dbid.txt
  • [⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记
  • [AutoSAR 存储] 汽车智能座舱的存储需求
  • [bzoj4240] 有趣的家庭菜园
  • [C++]:for循环for(int num : nums)
  • [C++]C++基础知识概述