• C#版的数据结构(对链表的操作)


    我们一般只是学过C/C++的数据结构,想必学C#的学生会疑惑,为什么C#没有数据结构呢,那我来告诉你,其实C#也是有数据结构的,只不过我们不了解罢了,经过我半天的编程,终于把C#的数据结构写出来了,也大大增加了我对数据结构的理解,在这里提供出来,共享学习,共同进步!

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace 控制台程序
    {
        class CSharp数据结构
        {
            public static void Main(string[] args)
            {
                Console.WriteLine("Hello");
                //ListNode list = new ListNode(10);
                Creastlist list = new Creastlist();
                list.Append(1);
                list.Append(2);
                list.Delete();//从队尾删除一个数据
                Console.WriteLine(list.ListCount);
                list.Clear();
                Console.WriteLine(list.ListCount);
                list.Append(1);
                list.Append(2);
                list.Append(4);
                list.Append(3);
                list.MovePrevious();
                list.Append(5);
                list.MovePrevious();
                Console.WriteLine(list.GetCurrentValue());
                //打印输出当前链表中的数据
                list.ShowList(list);
                list.Clear();
                Console.WriteLine("\n"+"清空后的链表节点个数为:"+list.ListCount);
                Console.WriteLine("新建一个初始化好的链表:");
                String str = Console.ReadLine();
                Creastlist NewList=new Creastlist(str);
                Console.Write("当前初试换好的链表为:\n");
                NewList.ShowList(NewList);
                Console.Write("\n链表中节点的个数为:");
                Console.WriteLine(NewList.ListCount);
                Console.Read();
            }
        }
        //  结点类
        public class ListNode
        {
            public ListNode(int NewValue)
            {
                Value = NewValue;
            }

            /// <summary>
            /// 前一个节点
            /// </summary>

            public ListNode Previous;

            /// <summary>
            /// 后一个节点
            /// </summary>
     
            public ListNode Next;

            /// <summary>
            /// 值
            /// </summary>
     
            public int Value;
        }
        // 定义结点之后,开始类线性表的操作编程了.在LIST 类中,采用了,Head ,Tail,  Current,三个指针,使用Append ,
        //MoveFrist,MovePrevious,MoveNext,MoveLast ,Delete,InsertAscending,InsertUnAscending ,Clear 实现移动,添加,
        //删除,升序插入,降序插入,清空链表操作,GetCurrentValue() 方法取得当前的值。
        public class Creastlist
        {
            public Creastlist()
            {
                //构造函数
                //初始化
                ListCountValue = 0;
                Head = null;
                Tail = null;
            }
            /// <summary>
            /// 构造一个初始化好的链表
            /// </summary>
            /// <param name="str">初始化的字符串,并以逗号或者空格隔开</param>
            public Creastlist(string str)
            {
                //构造函数
                //初始化
                char[] separator = { ',',' '};
                string[] s = str.Split(separator);
                Creastlist list = new Creastlist();
                foreach (string i in s)
                {
                    int j=Convert.ToInt32(i);
                    list.Append(j);
                }
                ListCountValue = s.Length;
                Tail = list.Current;
                Head = list.Head;
            }

            /// <summary>
            /// 头指针
            /// </summary>
            private ListNode Head;

            /// <summary>
            ///  尾指针
            /// </summary>
            private ListNode Tail;

            /// <summary>
            /// 当前指针
            /// </summary>
            private ListNode Current;

            /// <summary>
            /// 链表数据的个数
            /// </summary>
            private int ListCountValue;

            /// <summary>
            /// 尾部添加数据
            /// </summary>
            /// <param name="DataValue">值</param>
            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;
            }
            /// <summary>
            /// 删除当前的数据
            /// </summary>
            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;
                }
            }

            /// <summary>
            /// 向后移动一个数据
            /// </summary>
            public void MoveNext()
            {
                if (!IsEof()) Current = Current.Next;
            }

            /// <summary>
            /// 向前移动一个数据
            /// </summary>
            public void MovePrevious()
            {
                if (!IsBof()) Current = Current.Previous;
            }

            /// <summary>
            /// 移动到第一个数据
            /// </summary>
            public void MoveFrist()
            {
                Current = Head;
            }


            /// <summary>
            ///  移动到最后一个数据
            /// </summary>
            public void MoveLast()
            {
                Current = Tail;
            }

            /// <summary>
            /// 判断是否为空链表
            /// </summary>
            /// <returns>返回bool值</returns>
            public bool IsNull()
            {
                if (ListCountValue == 0)
                    return true;

                return false;
            }

            /// <summary>
            /// 判断是否为到达尾
            /// </summary>
            /// <returns></returns>
            public bool IsEof()
            {
                if (Current == Tail)
                    return true;
                return false;
            }

            /// <summary>
            /// 判断是否为到达头部
            /// </summary>
            /// <returns></returns>
            public bool IsBof()
            {
                if (Current == Head)
                    return true;

                return false;
            }
           
            /// <summary>
            /// 获取当前数据
            /// </summary>
            /// <returns>返回当前节点的值</returns>
            public int GetCurrentValue()
            {
                return Current.Value;
            }

            /// <summary>
            ///  取得链表的数据个数
            /// </summary>
            public int ListCount
            {
                get
                {
                    return ListCountValue;
                }
            }


            /// <summary>
            /// 清空链表
            /// </summary>
            public void Clear()
            {
                MoveFrist();
                while (!IsNull())
                {
                    //若不为空链表,从尾部删除 
                    Delete();
                }
            }


            /// <summary>
            ///  在当前位置前插入数据
            /// </summary>
            /// <param name="DataValue">要插入的数据</param>
            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;
            }

            /// <summary>
            /// 进行升序插入
            /// </summary>
            /// <param name="InsertValue"></param>
     
            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();
                }
            }

            /// <summary>
            /// 打印链表中全部的数
            /// </summary>
            /// <param name="list">链表参数</param>
            public void ShowList(Creastlist list)
            {
                Console.WriteLine("当前链表中数据为:");
                list.MoveFrist();
                for (int i = 0; i < list.ListCount;i++ )
                {
                    Console.Write(list.GetCurrentValue() + "  ");
                    list.MoveNext();
                }
            }

        }

    }


    如有不当之处,请指正!QQ:1830916711

  • 相关阅读:
    leetcode整理(一)
    day02 整理
    python从入门到放弃之守护进程
    python从入门到放弃之进程
    基于hashlib下的文件校验
    hashlib(hmac)进阶之client跟server交互
    hashlib以及hmac的日常应用
    python从入门到放弃
    6.redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?持久化机制具体底层是如何实现的?
    5.如何保证 redis 的高并发和高可用?redis 的主从复制原理能介绍一下么?redis 的哨兵原理能介绍一下么?
  • 原文地址:https://www.cnblogs.com/java20130723/p/3211491.html
Copyright © 2020-2023  润新知