C# 单向链表的实现方法

 更新时间:2025年11月13日 12:08:54   作者:yue008  
本文介绍了C#中单向链表的基本概念、节点结构以及基本操作,包括查找、插入和删除节点的方法,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

在C#中,链表是一种特殊的数据结构,动态存储一种结构类型数据。本文主要介绍一个单向链表。

知识点

链表是一种数据结构,由节点组成,每个节点包含两部分数据,第一部分是节点本身的数据,第二部分是指向下一节点的指针,对于单向链表,链表中存在两个特殊的节点,分别为头节点和尾节点,头节点本身没有数据,只存储下一个节点的指针,尾节点只存储数据

对于链表的操作,主要是节点的查找、插入和删除操作
1、查找节点。根据节点的数据查找节点,要实现此功能,需要遍历链表中的所有节点,可以从链表头节点开始,利用循环的方式向下查找。
如果当前节点指向的下一个节点不为空,则将下一个节点设置为当前节点。
2、插入节点。插入节点分两种情况。
a、在链表末尾插入节点。这种只需将当前尾节点中指向下一个节点的指针指向新插入的节点即可。
b、在链表中间位置插入节点,需要确定在哪个节点插入新的节点,然后记录当前节点的下一个节点,,并定义的一个临时的节点进行记录,最后将当前节点的下一个节点指向新添加的节点,再将新添加节点的下一个节点指向临时节点


3、删除节点。删除节点和插入节点情况类似。
a、删除尾节点,需要找到尾节点之前的一个节点,将该节点指向的下一个节点设置为空,然后释放尾节点资源。
b、删除链表中间部分的节点。需要找到当前节点的上一个节点,并定义一个临时节点PriorNode进行记录,然后再定义一个临时节点TempNode记录当前节点的下一个节点,最后将PriorNode的下一个节点指向TempNode,并释放当前节点。

namespace UnilateralismChainTable
{
    //  结点类
    public class ListNode
    {
        public ListNode(int NewValue)
        {
            Value = NewValue;
        }
        //前一个
        public ListNode Previous;
        // 后一个
        public ListNode Next;
        // 值
        public int Value;
    }
    // 定义结点之后,开始类线性表的操作编程了.在LIST 类中,采用了,Head ,Tail,  Current,三个指针,使用Append ,
    //MoveFrist,MovePrevious,MoveNext,MoveLast ,Delete,InsertAscending,InsertUnAscending ,Clear 实现移动,添加,
    //删除,升序插入,降序插入,清空链表操作,GetCurrentValue() 方法取得当前的值。
    public class Clist
    {
        public Clist()
        {
            //构造函数
            //初始化
            ListCountValue = 0;
            Head = null;
            Tail = null;
        }
        // 头指针
        private ListNode Head;
        // 尾指针  
        private ListNode Tail;
        // 当前指针
        private ListNode Current;
        //链表数据的个数
        private int ListCountValue;
        //尾部添加数据 
        public void Append(int DataValue)
        {
            ListNode NewNode = new ListNode(DataValue);
            if (IsNull())
            //如果头指针为空
            {
                Head = NewNode;
                Tail = NewNode;
            }
            else
            {
                Tail.Next = NewNode;
                NewNode.Previous = Tail;
                Tail = NewNode;
            }
            Current = NewNode;
            //链表数据个数加一
            ListCountValue += 1;
        }
        //删除当前的数据
        public void Delete()
        {
            //若为空链表
            if (!IsNull())
            {
                //若删除头
                if (IsBof())
                {
                    Head = Current.Next;
                    Current = Head;
                    ListCountValue -= 1;
                    return;
                }
                //若删除尾
                if (IsEof())
                {
                    Tail = Current.Previous;
                    Current = Tail;
                    ListCountValue -= 1;
                    return;
                }
                //若删除中间数据
                Current.Previous.Next = Current.Next;
                Current = Current.Previous;
                ListCountValue -= 1;
                return;
            }
        }
        // 向后移动一个数据
        public void MoveNext()
        {
            if (!IsEof()) Current = Current.Next;
        }
        // 向前移动一个数据
        public void MovePrevious()
        {
            if (!IsBof()) Current = Current.Previous;
        }
        // 移动到第一个数据  
        public void MoveFrist()
        {
            Current = Head;
        }
        // 移动到最后一个数据
        public void MoveLast()
        {
            Current = Tail;
        }
        // 判断是否为空链表
        public bool IsNull()
        {
            if (ListCountValue == 0)
                return true;
            return false;
        }
        // 判断是否为到达尾  
        public bool IsEof()
        {
            if (Current == Tail)
                return true;
            return false;
        }
        // 判断是否为到达头部
        public bool IsBof()
        {
            if (Current == Head)
                return true;
            return false;
        }
        public int GetCurrentValue()
        {
            return Current.Value;
        }
        // 取得链表的数据个数
        public int ListCount
        {
            get
            {
                return ListCountValue;
            }
        }
        // 清空链表
        public void Clear()
        {
            MoveFrist();
            while (!IsNull())
            {
                //若不为空链表,从尾部删除  
                Delete();
            }
        }
        // 在当前位置前插入数据
        public void Insert(int DataValue)
        {
            ListNode NewNode = new ListNode(DataValue);
            if (IsNull())
            {
                //为空表,则添加
                Append(DataValue);
                return;
            }
            if (IsBof())
            {
                //为头部插入
                NewNode.Next = Head;
                Head.Previous = NewNode;
                Head = NewNode;
                Current = Head;
                ListCountValue += 1;
                return;
            }
            //中间插入
            NewNode.Next = Current;
            NewNode.Previous = Current.Previous;
            Current.Previous.Next = NewNode;
            Current.Previous = NewNode;
            Current = NewNode;
            ListCountValue += 1;
        }
        // 进行升序插入  
        public void InsertAscending(int InsertValue)
        {
            //参数:InsertValue 插入的数据
            //为空链表
            if (IsNull())
            {
                //添加
                Append(InsertValue);
                return;
            }
            //移动到头
            MoveFrist();
            if ((InsertValue < GetCurrentValue()))
            {
                //满足条件,则插入,退出
                Insert(InsertValue);
                return;
            }
            while (true)
            {
                if (InsertValue < GetCurrentValue())
                {
                    //满族条件,则插入,退出
                    Insert(InsertValue);
                    break;
                }
                if (IsEof())
                {
                    //尾部添加
                    Append(InsertValue);
                    break;
                }
                //移动到下一个指针
                MoveNext();
            }
        }
        //进行降序插入
        public void InsertUnAscending(int InsertValue)
        {
            //参数:InsertValue 插入的数据                      
            //为空链表
            if (IsNull())
            {
                //添加
                Append(InsertValue);
                return;
            }
            //移动到头
            MoveFrist();
            if (InsertValue > GetCurrentValue())
            {
                //满足条件,则插入,退出
                Insert(InsertValue);
                return;
            }
            while (true)
            {
                if (InsertValue > GetCurrentValue())
                {
                    //满族条件,则插入,退出
                    Insert(InsertValue);
                    break;
                }
                if (IsEof())
                {
                    //尾部添加
                    Append(InsertValue);
                    break;
                }
                //移动到下一个指针
                MoveNext();
            }
        }
    }
}

到此这篇关于C# 单向链表的实现的文章就介绍到这了,更多相关C# 单向链表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 枚举的用法详细总结

    枚举的用法详细总结

    本篇文章主要是对枚举的用法进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01
  • C#使用委托(delegate)实现在两个form之间传递数据的方法

    C#使用委托(delegate)实现在两个form之间传递数据的方法

    这篇文章主要介绍了C#使用委托(delegate)实现在两个form之间传递数据的方法,涉及C#委托的使用技巧,需要的朋友可以参考下
    2015-04-04
  • C#微信开发第一章

    C#微信开发第一章

    这篇文章主要为大家详细介绍了C#微信开发第一章,很有参考价值和实用性,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • Base64编码解码原理及C#编程实例

    Base64编码解码原理及C#编程实例

    这篇文章主要介绍了Base64编码解码原理及C#编程实例,本文讲解了Base64编码由来、Base64编码原理、C#编程实现,需要的朋友可以参考下
    2014-10-10
  • C#9.0主要特性的一些想法

    C#9.0主要特性的一些想法

    这篇文章主要给大家介绍了关于C#9.0主要特性的一些想法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • C#读取文件MD5值的实现代码

    C#读取文件MD5值的实现代码

    这篇文章主要介绍了C#读取文件MD5值的实现代码,有了这个核心代码,就可以实现校验文件MD5值的一些程序了,需要的朋友可以参考下
    2014-08-08
  • C#中StringBuilder类的使用总结

    C#中StringBuilder类的使用总结

    本篇文章主要是对C#中StringBuilder类的使用方法进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01
  • 基于C#编写计算机选课程序

    基于C#编写计算机选课程序

    在这篇文章中将介绍如何开发一个简单的计算机选课程序,文中主要使用了C#语言和Windows Forms来构建这个应用程序,感兴趣的小伙伴可以了解下
    2024-10-10
  • 如何搭建新的WPF项目框架

    如何搭建新的WPF项目框架

    这篇文章主要介绍了如何搭建新的WPF项目框架,在项目开发中比较常见的开发模式就是MVVM模式,使用MVVM框架开发好处:1、框架较轻,2、学习成本低、3、适用大多数中小型项目,4、相对于微软的prism框架更容易上手,需要的朋友可以参考下
    2015-07-07
  • C#多线程的相关操作讲解

    C#多线程的相关操作讲解

    本文详细讲解了C#多线程的相关操作,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03

最新评论