C#实现链表zz

链表:链表是用一组任意的存储单元来存储线性表中的数据元素。为此,在存储数据元素时,除了存储数据元 素本身的信息外,还要存储与它相邻的数据元素的存储地址信息。这两部分信息组成该数据元素的存储映像,称为结点(Node)。把存储据元素本身 信息的域叫结点的数据域,把存储与它相邻的数据元素的存储地址信息的域叫结点的引用域。

节点类:

ExpandedBlockStart.gif 代码
using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  DateStructrues.Lists.Node
{
    
///   <summary>
    
///  节点类。
    
///   </summary>
    
///   <typeparam name="T"></typeparam>
     public   class  DNode < T >
    {
        
#region  Fields

        
//
        
// 数据域
        
//
        T _data;

        
//
        
// 地址域(下一个)
        
//
        DNode < T >  _next;

        
//
        
// 地址域(上一个)
        
//
        DNode < T >  _prev;

        
#endregion

        
#region  Constructor

        
///   <summary>
        
///  构造器
        
///   </summary>
        
///   <param name="value"></param>
         public  DNode(T value)
        {
            _data 
=  value;
        }

        
///   <summary>
        
///  构造器
        
///   </summary>
        
///   <param name="value"></param>
        
///   <param name="prev"></param>
        
///   <param name="next"></param>
         public  DNode(T value, DNode < T >  prev, DNode < T >  next)
        {
            _data 
=  value;
            _prev 
=  prev;
            _next 
=  next;
        }

        
///   <summary>
        
///  构造器
        
///   </summary>
         public  DNode() { }

        
#endregion

        
#region  Properties

        
///   <summary>
        
///  地址域属性(上一个)。
        
///   </summary>
         public  DNode < T >  Prev
        {
            
get
            {
                
return  _prev;
            }
            
set
            {
                _prev 
=  value;
            }
        }

        
///   <summary>
        
///  地址域属性(下一个)。
        
///   </summary>
         public  DNode < T >  Next
        {
            
get
            {
                
return  _next;
            }
            
set
            {
                _next 
=  value;
            }
        }

        
///   <summary>
        
///  数据域属性。
        
///   </summary>
         public  T Data
        {
            
get
            {
                
return  _data;
            }
            
set
            {
                _data 
=  value;
            }
        }

        
#endregion
    }
}

链表:

ExpandedBlockStart.gif 代码
using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Collections;

namespace  DateStructrues.Lists.Node
{
    
///   <summary>
    
///  链表
    
///   </summary>
    
///   <typeparam name="T"> 数据类型 </typeparam>
     public   class  LinkList < T >  : IList < T >
    {
        
#region  Fields

        
//
        
//  头节点
        
//
        Node < T >  head;

        
//
        
//  尾节点
        
//
        Node < T >  rear;

        
//
        
//  记录节点的个数
        
//
         int  count;

        
#endregion

        
#region  Methods

        
///   <summary>
        
///  通过遍历,求链表的长度。
        
///   </summary>
        
///   <returns> 长度 </returns>
         public   int  GetCount()
        {
            
int  count  =   0 ;
            Node
< T >  p  =  head;
            
while  (p  !=   null )
            {
                count
++ ;
                p 
=  p.Next;
            }
            
return  count;
        }

        
///   <summary>
        
///  获得节点。
        
///   </summary>
        
///   <param name="index"> 索引 </param>
        
///   <returns> 对应的节点 </returns>
         public  Node < T >  GetNodeByIndex( int  index)
        {
            
if  (index  <   0 )
            {
                
return   null ;
            }

            Node
< T >  p  =  head;
            
int  count  =   0 ;
            
while  (p  !=   null )
            {
                
if  (index  ==  count)
                {
                    
return  p;
                }
                count
++ ;
                p 
=  p.Next;
            }
            
return   null ;
        }

        
///   <summary>
        
///  复制
        
///   </summary>
        
///   <returns></returns>
         public  LinkList < T >  Copy()
        {
            LinkList
< T >  tmp  =   new  LinkList < T > ();
            tmp.head 
=   new  Node < T > (head.Data);
            Node
< T >  p1  =  tmp.head;
            Node
< T >  p2  =  head.Next;

            
while  (p2  !=   null )
            {
                Node
< T >  tmpNode  =   new  Node < T > (p2.Data);
                p1.Next 
=  tmpNode;

                p1 
=  p1.Next;
                p2 
=  p2.Next;
            }

            
return  tmp;
        }

        
///   <summary>
        
///  倒序
        
///   </summary>
         public   void  Revers()
        {
            Node
< T >  p  =  head.Next;
            Node
< T >  q  =   new  Node < T > ();
            head.Next 
=   null ;
            
while  (p  !=   null )
            {
                q 
=  p;
                p 
=  p.Next;
                q.Next 
=  head.Next;
                head.Next 
=  q;
            }
        }

        
///   <summary>
        
///  合并
        
///   </summary>
        
///   <param name="Ha"></param>
        
///   <param name="Hb"></param>
        
///   <returns></returns>
         public   static  LinkList < int >  Merge(LinkList < int >  Ha, LinkList < int >  Hb)
        {
            LinkList
< int >  Hc  =   new  LinkList < int > ();
            Node
< int >  p  =  Ha.head;
            Node
< int >  q  =  Hb.head;
            Node
< int >  s  =   new  Node < int > ();
            Hc 
=  Ha;
            Hc.head 
=   null ;
            
while  (p  !=   null   &&  q  !=   null )
            {
                
if  (p.Data  <  q.Data)
                {
                    s 
=  p;
                    p 
=  p.Next;
                }
                
else
                {
                    s 
=  q;
                    q 
=  q.Next;
                }
                Hc.Add(s.Data);
            }
            
if  (p  ==   null )
            {
                p 
=  q;
            }
            
while  (p  !=   null )
            {
                s 
=  p;
                p 
=  p.Next;
                Hc.Add(s.Data);
            }
            
return  Hc;
        }

        
///   <summary>
        
///  合并,由于同上一个合并方法签名相同,即不能重载
        
///   </summary>
        
///   <param name="Ha"></param>
        
///   <param name="Hb"></param>
        
///   <returns></returns>
         public   static  LinkList < int >  Merge2(LinkList < int >  Ha, LinkList < int >  Hb)
        {
            LinkList
< int >  Hc  =   new  LinkList < int > ();
            Node
< int >  p  =  Ha.head;
            Node
< int >  q  =  Hb.head;
            Node
< int >  s  =   new  Node < int > ();
            Hc 
=  Ha;
            Hc.head 
=   null ;
            
// 两个表非空
             while  (p  !=   null   &&  q  !=   null )
            {
                
if  (p.Data  <  q.Data)
                {
                    s 
=  p;
                    p 
=  p.Next;
                }
                
else
                {
                    s 
=  q;
                    q 
=  q.Next;
                }
                s.Next 
=  Hc.head;
                Hc.head 
=  s;
            }
            
// 第2个表非空而第1个表为空
             if  (p  ==   null )
            {
                p 
=  q;
            }
            
// 将两表中的剩余数据元素附加到新表的末尾
             while  (p  !=   null )
            {
                s 
=  p;
                p 
=  p.Next;
                s.Next 
=  Hc.head;
                Hc.head 
=  s;
            }
            
return  Hc;
        }

        
///   <summary>
        
///  取消
        
///   </summary>
        
///   <param name="Ha"></param>
        
///   <returns></returns>
         public   static  LinkList < int >  Purge(LinkList < int >  Ha)
        {
            LinkList
< int >  Hb  =   new  LinkList < int > ();
            Node
< int >  p  =  Ha.head;
            Node
< int >  q  =   new  Node < int > ();
            Node
< int >  s  =   new  Node < int > ();
            s 
=  p;
            p 
=  p.Next;
            s.Next 
=   null ;
            Hb.head 
=  s;
            
while  (p  !=   null )
            {
                s 
=  p;
                p 
=  p.Next;
                q 
=  Hb.head;
                
while  (q  !=   null   &&  q.Data  !=  s.Data)
                {
                    q 
=  q.Next;
                }
                
if  (q  ==   null )
                {
                    s.Next 
=  Hb.head;
                    Hb.head 
=  s;
                }
            }
            
return  Hb;
        }

        
#endregion

        
#region  Properties

        
///   <summary>
        
///  数组模式,主要用于调试时查看。
        
///   </summary>
         public  T[] ArrayMode
        {
            
get
            {
                T[] arr 
=   new  T[Count];
                Node
< T >  p  =  head;
                
int  count  =   0 ;
                
while  (p  !=   null )
                {
                    arr[count] 
=  p.Data;
                    p 
=  p.Next;
                    count
++ ;
                }
                
return  arr;
            }
        }

        
#endregion

        
#region  IList<T> 成员

        
///   <summary>
        
///  求元素所在的索引。
        
///   </summary>
        
///   <param name="item"> 要查找的元素 </param>
        
///   <returns> 所在索引 </returns>
         public   int  IndexOf(T item)
        {
            
//  用于遍历链表
            Node < T >  p  =  head;

            
//  计数器
             int  count  =   0 ;

            
while  (p  !=   null )
            {
                
if  (p.Data.Equals(item))
                {
                    
return  count;
                }

                count
++ ;

                
//  移到下一个节点
                p  =  p.Next;
            }
            
return   - 1 ;
        }

        
///   <summary>
        
///  插入元素。
        
///   </summary>
        
///   <param name="index"> 索引 </param>
        
///   <param name="item"> 要插入的项 </param>
         public   void  Insert( int  index, T item)
        {
            
int  count  =   1 ;
            Node
< T >  p  =  head;
            Node
< T >  v  =   new  Node < T > (item);
            
if  (index  ==   0 )
            {
                
if  (head  ==   null )
                {
                    rear 
=  v;
                }

                v.Next 
=  head;
                head 
=  v;
                
this .count ++ ;
                
return ;
            }

            
while  (p  !=   null )
            {
                
if  (count  ==  index)
                {
                    
if  (p.Next  ==   null )
                        rear 
=  v;
                    v.Next 
=  p.Next;
                    p.Next 
=  v;

                    
this .count ++ ;
                    
break ;
                }
                p 
=  p.Next;
                count
++ ;
            }
        }

        
///   <summary>
        
///  以索引方式删除元素
        
///   </summary>
        
///   <param name="index"> 索引 </param>
         public   void  RemoveAt( int  index)
        {
            
int  count  =   0 ;
            
if  (index  ==   0 )
            {
                head 
=  head.Next;
                
this .count -- ;
                
return ;
            }
            Node
< T >  p  =  head;
            Node
< T >  prev  =  head;
            
while  (p  !=   null )
            {
                
if  (count  ==  index)
                {
                    prev.Next 
=  p.Next;
                    
this .count -- ;
                    
if  (p.Next  ==   null )
                    {
                        rear 
=  prev;
                    }
                    
break ;
                }
                prev 
=  p;
                p 
=  p.Next;
                count
++ ;
            }
        }

        
///   <summary>
        
///  以索引方式访问
        
///   </summary>
        
///   <param name="index"> 索引 </param>
        
///   <returns> 对应的元素 </returns>
         public  T  this [ int  index]
        {
            
get
            {
                
try
                {
                    Node
< T >  p  =  GetNodeByIndex(index);
                    
return  p.Data;
                }
                
catch  (NullReferenceException)
                {
                    
throw   new  IndexOutOfRangeException( " 索引超出数组界限。 " );
                }
            }
            
set
            {
                
try
                {
                    Node
< T >  p  =  GetNodeByIndex(index);
                    p.Data 
=  value;
                }
                
catch  (NullReferenceException)
                {
                    
throw   new  IndexOutOfRangeException( " 索引超出数组界限。 " );
                }
            }
        }

        
#endregion

        
#region  ICollection<T> 成员

        
///   <summary>
        
///  向链表末尾,追加元素
        
///   </summary>
        
///   <param name="item"> 要追加的元素 </param>
         public   void  Add(T item)
        {
            Node
< T >  p  =   new  Node < T > (item);

            
if  (head  ==   null )
            {
                head 
=  p;

                
//  将这个节点设为末尾。
                rear  =  p;

                
this .count  =   1 ;
                
return ;
            }

            rear.Next 
=  p;
            rear 
=  p;

            count
++ ;
        }

        
///   <summary>
        
///  清空
        
///   </summary>
         public   void  Clear()
        {
            head 
=   null ;
            rear 
=   null ;
        }

        
///   <summary>
        
///  是否包含元素
        
///   </summary>
        
///   <param name="item"> 检查是否包含的元素 </param>
        
///   <returns> 是否存在 </returns>
         public   bool  Contains(T item)
        {
            
int  index  =  IndexOf(item);
            
return  (index  !=   - 1 );
        }

        
///   <summary>
        
///  将数据拷贝到数组
        
///   </summary>
        
///   <param name="array"> 准备的数组 </param>
        
///   <param name="arrayIndex"> 开始的索引 </param>
         public   void  CopyTo(T[] array,  int  arrayIndex)
        {
            ArrayMode.CopyTo(array, arrayIndex);
        }

        
///   <summary>
        
///  获得此链表的元素个数
        
///   </summary>
         public   int  Count
        {
            
get
            {
                
return  GetCount();
            }
        }

        
///   <summary>
        
///  获得是否是只读。
        
///   </summary>
         public   bool  IsReadOnly
        {
            
get
            {
                
return   false ;
            }
        }

        
///   <summary>
        
///  删除元素
        
///   </summary>
        
///   <param name="item"> 将要被删除的元素 </param>
        
///   <returns> 是否成功删除 </returns>
         public   bool  Remove(T item)
        {
            Node
< T >  prev  =   null ;
            Node
< T >  p  =  head;

            
while  (p  !=   null )
            {
                
if  (p.Data.Equals(item))
                {
                    
if  (prev  !=   null )
                        prev.Next 
=  p.Next;
                    
else
                        head 
=  head.Next;

                    
this .count -- ;
                    
return   true ;
                }
                prev 
=  p;
                p 
=  p.Next;

            }
            
return   false ;
        }

        
#endregion

        
#region  IEnumerable<T> 成员

        
public  IEnumerator < T >  GetEnumerator()
        {
            
throw   new  Exception( " The method or operation is not implemented. " );
        }

        
#endregion

        
#region  IEnumerable 成员

        IEnumerator IEnumerable.GetEnumerator()
        {
            
throw   new  Exception( " The method or operation is not implemented. " );
        }

        
#endregion
    }
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值