C#チェーンテーブル:簡単な実装

4884 ワード

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、データは相対的に固定されており、使用状況に応じて柔軟にデータ構造を調整しなければならない.