用单链表解决线性表的编程问题

本文详细介绍了使用单链表解决线性表问题的方法,包括单链表的基本概念、结点结构、常用操作如插入、删除、查找等,并提供了完整的C#代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用单链表解决线性表的编程问题 :

链表分为单链表,双链表,循环列表等多种类型。

在存储数据元素时,除了存储数据元素本身的信息外,还要存储与它相邻的数据元素的存储地址信息。这两部分信息组成该数据元素的存储映像,成为结点(Node)。把存储数据元素本身信息的域成为节点的数据域,把存储与它相邻数据元素的存储地址信息的域称为结点的引用域。

如果结点的引用域只存储该结点直接后继结点的存储地址,则该链表称为单链表。

单链表是最简单的链表,其中每个结点指向列表中的下一个结点,最后一个结点不指向任何其他结点,它指向NULL。这意味着指向NULL的结点代表列表结束。

 

带头节点单链表的结点示意图:

代码实现:

using System;

namespace 用单链表解决线性表的编程问题
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
    interface IlinarList<T>
    {
        void InsertNode(T a, int i);//插入数据元素(这里只讲前插)。插入结点有3种情况:开头插入,中间插入,末尾插入
        void DeleteNode(int i);     //删除数据元素.
        T SearchNode(int i);//查找表元素
        T SearchNode(T value);//定位元素
        int GetLength();//求表长度
        void Clear();//清空操作
        bool IsEmpty();//判断线性表是否为空
    }

    //单链表的结点
    class SNode<T>
    {
        private T data;//数据域
        private SNode<T> next;//引用域

        //数据域属性
        public T Data
        {
            get { return data; }
            set { data = value; }
        }

        //引用域属性
        public SNode <T> Next
        {
            get { return next; }
            set { next = value; }
        }

        public SNode (T val,SNode <T> p)
        {
            data = val;
            next = p;
        }
        public SNode(T val)
        {
            data = val;
            next = null;
        }
        public SNode (SNode <T> p)
        {
            next = p;
            data = default(T);
        }
        public SNode()
        {
            data = default(T);
            next = null;
        }
    }

    class SLinkList<T> : IlinarList<T>
    {
        private SNode<T> start;//单链表的头引用
        private int length;//单链表的长度

        /// <summary>
        /// 初始化单链表,即创建一个空的单链表
        /// </summary>
        public SLinkList() 
        {
            start = null;
        }

        /// <summary>
        /// 判断单链表是否为空
        /// </summary>
        /// <returns></returns>
        public bool IsEmpty()
        {
            if(start ==null)
            {
                return true;
            }else
            {
                return false;
            }
        }

        /// <summary>
        /// 清空单链表
        /// </summary>
        public void Clear()
        {
            start = null;
        }

        /// <summary>
        /// 求单链表的长度
        /// </summary>
        /// <returns></returns>
        public int GetLength()
        {
            return length;
        }

        /// <summary>
        /// 删除单链表的第i个数据元素
        /// </summary>
        /// <param name="i"></param>
        public void DeleteNode(int i)
        {
            if(IsEmpty ()||i<1||i>length)
            {
                Console.WriteLine("Link is empty or Position is error");
            }

            SNode<T> current = start;
            if (i == 1)
            {
                start = current.Next;
                length--;
                return;
            }

            SNode<T> previous = null;
            int j = 1;
            while (j < i&&current .Next !=null )
            {
                previous = current;
                current = current.Next;            
                j++;
            }
            if (j == i)
            {
                previous.Next = current.Next;
                current = null;
                length--;
            }
            else
            {
                Console.WriteLine("The node is not exist");
            }
        }

        /// <summary>
        /// 在单链表末尾追加数据元素
        /// </summary>
        /// <param name="a"></param>
        public void InsertNode(T a)
        {
            if(start ==null) //这里我觉得还可以写成 if(IsEmpty())
            {
                start = new SNode<T>(a);
                length++;
                return;
            }else
            {
                SNode<T> current = start;
                while (current.Next !=null)
                {
                    current = current.Next;
                }
                current.Next = new SNode<T>(a);
                length++;
            }
        }

        /// <summary>
        /// 在单链表的第i个数据元素的位置前插入一个数据元素
        /// </summary>
        /// <param name="a"></param>
        /// <param name="i"></param>
        public void InsertNode(T a, int i)
        {
            if(i<1||i>length + 1)
            {
                Console.WriteLine("Position is error");
                return;
            }
            SNode<T> newnode = new SNode<T>(a);

            //在空链表或第一个元素前插入第一个元素
            if (i == 1)
            {
                newnode.Next = start;
                start = newnode;
                length++;
                return;
            }

            //在单链表的两个元素之间插入一个元素
            SNode<T> current = start;
            SNode<T> previous = null;
            int j = 1;
            while (current !=null &&j<i)
            {
                previous = current;
                current = current.Next;
                j++;
            }
            if (j == i)
            {
                previous.Next = newnode;
                newnode.Next = current;
                length++;
            }
        }

        /// <summary>
        /// 获得单链表的第i个数据元素
        /// </summary>
        /// <param name="i"></param>
        /// <returns></returns>
        public T SearchNode(int i)
        {
            if(IsEmpty() || i < 1 || i > length)
            {
                Console.WriteLine("List is empty or Position is error");
                return default(T);
            }
            SNode<T> current = start;
            int j = 1;
            while (j<i&&current .Next !=null)
            {
                current = current.Next;
                j++;
            }
            if (j == i)
            {
                return current.Data;
            }else
            {
                Console.WriteLine("The node is not exist");
                return default(T); 
            }
            
        }

        /// <summary>
        /// 在单链表中查找值为value的数据元素
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public T SearchNode(T value)
        {
            if(IsEmpty())
            {
                Console.WriteLine("List is empty");
                return default(T);
            }
            SNode<T> current = start;

            int i = 1;
            while (current != null && !current.Data.ToString().Contains(value.ToString()))
            {
                current = current.Next;
                i++;
            }

            //while (current != null && !current.Data.ToString().Contains(value.ToString())) //我觉得这样也可以,没有必要添加i
            //{
            //    current = current.Next;
            //}

            if (current !=null)
            {
                return current.Data;
            }else
            {
                return default(T);
            }
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值