C#链表:一个简单实现

来源:互联网 发布:佳音简谱软件注册码 编辑:程序博客网 时间:2024/05/29 17:04

C#自带了泛型的链表类,在很多情况之下够用。遇到实际应用时,最好引用C#的链表类,封装成自己需要的类。

作为探索链表基本实现原理尝试实现了几个简单的方法。

一、(Node.cs文件)作为链表节点的类,将它封装在了链表类的内部。原因是客户在使用链表时不需要关注链表的节点类型。

<span style="font-family:Courier New;">using System;namespace LinkListTrial0._2{    partial class MyLinkedList<T>    {        class Node<DataType>:IComparable<DataType>,IEquatable<DataType>            where DataType:IComparable        {            DataType data;            Node<DataType> next;            public Node<DataType> Next            {                get                {                    return this.next;                }                set                {                    this.next = value;                }            }            public Node(DataType data)            {                this.data = data;                this.next = null;            }            // 比较接口的实现,直接比较链表节点与数据            public int CompareTo(DataType obj)            {                DataType objData = (DataType)obj;                return this.data.CompareTo(objData);            }            // 相等接口的实现,直接比较链表节点与数据            public bool Equals(DataType to_compare)            {                return this.data.Equals(to_compare);            }            // 打印数据            public override string ToString()            {                // TODO:可以加一些打印链接的创意                return this.data.ToString();            }        }    }    }</span>

二、(MyLinkedList.cs文件)实现简单链表的类,存放实现链表的主要逻辑。主要目的是实现简单链表的增加和删除逻辑。

<span style="font-family:Courier New;">using System;namespace LinkListTrial0._2{    partial  class MyLinkedList<T>        where T:IComparable    {        Node<T> Head;        public MyLinkedList()        {            // 在链表头部放置一个虚拟节点,简化逻辑            Node<T> dummy = new Node<T>(default(T));            this.Head =dummy;        }        public void AddAscend(T to_add)        {            Node<T> currentNode = Head;            Node<T> nextNode;            // 升序排列数据            for ( nextNode = currentNode.Next ; nextNode!=null && nextNode.CompareTo(to_add) < 0; )            {                currentNode = nextNode;                nextNode = currentNode.Next;            }            // 忽略重复数据            if (nextNode!=null && nextNode.Equals(to_add))            {                return;            }                        // 插入新来的非重复数据            Node<T> toaddNode = new Node<T>(to_add);            currentNode.Next = toaddNode;            toaddNode.Next = nextNode;        }        public void Delete(T to_delete)        {            Node<T> currentNode = Head;            Node<T> nextNode;            // 检测所有数据是否与待删除的数据相等            for (nextNode=currentNode.Next;!( nextNode==null || nextNode.Equals(to_delete)); )            {                currentNode = nextNode;                nextNode = currentNode.Next;            }                        // 从中间删除数据            if (nextNode != null)            {                currentNode.Next = nextNode.Next;            }        }        public void Clear()        {            // 清空所有数据            this.Head.Next = null;        }        public void PrintAll()        {            Node<T> currentNode = Head;            Node<T> nextNode;            for (nextNode=currentNode.Next; nextNode!=null; )            {                Console.WriteLine(nextNode.ToString());                currentNode = nextNode;                nextNode = currentNode.Next;            }        }    }}</span>

三、(Program.cs文件)简单的测试程序。

<span style="font-family:Courier New;">using System;namespace LinkListTrial0._2{    class Program    {        static void Main(string[] args)        {            MyLinkedList<int> list = new MyLinkedList<int>();            list.Clear();            list.AddAscend(1);            list.AddAscend(6);            list.AddAscend(1);            list.AddAscend(3);            list.AddAscend(4);            list.AddAscend(2);            list.AddAscend(5);            list.AddAscend(6);            list.PrintAll();            Console.WriteLine("----------------------------------------------");            list.Delete(6);            list.Delete(7);            list.PrintAll();            Console.ReadLine();        }    }}</span>


四、小结

1、实现了简单的列表。

2、没有考虑性能的因素。

3、数据是相对固定的,应该根据使用情况灵活调整数据结构。

0 0