当前位置: 代码网 > it编程>编程语言>Asp.net > C# 单向链表的实现方法

C# 单向链表的实现方法

2025年11月13日 Asp.net 我要评论
在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# 单向链表内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com