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# 单向链表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C# DataTable.Select()根据条件筛选数据问题

    C# DataTable.Select()根据条件筛选数据问题

    这篇文章主要介绍了C# DataTable.Select()根据条件筛选数据问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • C# DataTable数据遍历优化详解

    C# DataTable数据遍历优化详解

    这篇文章主要介绍了C# DataTable数据遍历优化详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • C# 对PDF文档加密、解密(基于Spire.Cloud.SDK for .NET)

    C# 对PDF文档加密、解密(基于Spire.Cloud.SDK for .NET)

    这篇文章主要介绍了C# 基于Spire.Cloud.SDK for .NET对PDF文档进行加密解密,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • C# 调用API函数弹出映射网络驱动器对话框问题

    C# 调用API函数弹出映射网络驱动器对话框问题

    C#中的.net的常用对话框中没有映射网络驱动映射对话框,所以需要用windows的API函数去实现弹出映射网络驱动器对话框
    2014-01-01
  • WPF利用ScottPlot实现动态绘制图像

    WPF利用ScottPlot实现动态绘制图像

    ScottPlot是基于.Net的一款开源免费的交互式可视化库,支持Winform和WPF等UI框架,本文主要为大家详细介绍了如何WPF如何使用ScottPlot实现动态绘制图像,需要的可以参考下
    2023-12-12
  • C#中如何把dll打包到exe

    C#中如何把dll打包到exe

    这篇文章主要介绍了C#中如何把dll打包到exe问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • 浅谈c#开发者应该了解的15个特性

    浅谈c#开发者应该了解的15个特性

    本文列举了15个值得了解的C#特性,旨在让.NET开发人员更好的使用C#语言进行开发工作。
    2021-05-05
  • 基于WPF开发简单的颜色选择器

    基于WPF开发简单的颜色选择器

    这篇文章主要介绍了如何基于WPF实现简单的颜色选择器,文中的示例代码讲解详细,对我们学习或工作有一定帮助,需要的小伙伴可以参考一下
    2023-07-07
  • 详解C# 中Session的用法

    详解C# 中Session的用法

    这篇文章主要介绍了C# 中Session的用法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • 详细了解C# 枚举与位枚举

    详细了解C# 枚举与位枚举

    这篇文章主要介绍了C# 枚举与位枚举的相关资料,文中讲解非常细致,帮助大家更好的理解和学习枚举和位枚举,感兴趣的朋友可以了解下
    2020-07-07

最新评论