C#单链表的实现及其应用

ExpandedBlockStart.gif 代码
单链表结点类的实现如下所示。
       
public   class  Node < T >
        {
            
private  T data;  // 数据域
             private  Node < T >  next;  // 引用域
            
// 构造器
             public  Node(T val, Node < T >  p)
            {
                data 
=  val;
                next 
=  p;
            }
            
// 构造器
             public  Node(Node < T >  p)
            {
                next 
=  p;
            }
            
// 构造器
             public  Node(T val)
            {
                data 
=  val;
                next 
=   null ;
            }
            
// 构造器
             public  Node()
            {
                data 
=   default (T);
                next 
=   null ;
            }
            
// 数据域属性
             public  T Data
            {
                
get
                {
                    
return  data;
                }
                
set
                {
                    data 
=  value;
                }
            }
            
// 引用域属性
             public  Node < T >  Next
            {
                
get
                {
                    
return  next;
                }
                
set
                {
                    next 
=  value;
                }
            }
        }
链表操作实现类
public   class  LinkList < T >  : IListDS < T >
{
        
private  Node < T >  head;  // 单链表的头引用
        
// 头引用属性
         public  Node < T >  Head
        {
            
get
            {
                
return  head;
            }
            
set
            {
                head 
=  value;
            }
        }
        
// 构造器
         public  LinkList()
        {
            head 
=   null ;
        }
        
// 求单链表的长度
         public   int  GetLength()
        {
            Node
< T >  p  =  head;
            
int  len  =   0 ;
            
while  (p  !=   null )
            {
                
++ len;
                p 
=  p.Next;
            }
            
return  len;
        }
        
// 清空单链表
         public   void  Clear()
        {
            head 
=   null ;
        }
        
// 判断单链表是否为空
         public   bool  IsEmpty()
        {
            
if  (head  ==   null )
            {
                
return   true ;
            }
            
else
            {
                
return   false ;
            }
        }
        
// 在单链表的末尾添加新元素
         public   void  Append(T item)
        {
            Node
< T >  q  =   new  Node < T > (item);
            Node
< T >  p  =   new  Node < T > ();
            
if  (head  ==   null )
            {
                head 
=  q;
                
return ;
            }
            p 
=  head;
            
while  (p.Next  !=   null )
            {
                p 
=  p.Next;
            }
            p.Next 
=  q;
        }
        
// 在单链表的第i个结点的位置前插入一个值为item的结点
         public   void  Insert(T item,  int  i)
        {
            
if  (IsEmpty()  ||  i  <   1 )
            {
                Console.WriteLine(
" List is empty or Position is error! " );
                
return ;
            }
            
if  (i  ==   1 )
            {
                Node
< T >  q  =   new  Node < T > (item);
                q.Next 
=  head;
                head 
=  q;
                
return ;
            }
            Node
< T >  p  =  head;
            Node
< T >  r  =   new  Node < T > ();
            
int  j  =   1 ;
            
while  (p.Next  !=   null   &&  j  <  i)
            {
                r 
=  p;
                p 
=  p.Next;
                
++ j;
            }
            
if  (j  ==  i)
            {
                Node
< T >  q  =   new  Node < T > (item);
                q.Next 
=  p;
                r.Next 
=  q;
            }
        }
        
// 在单链表的第i个结点的位置后插入一个值为item的结点
         public   void  InsertPost(T item,  int  i)
        {
            
if  (IsEmpty()  ||  i  <   1 )
            {
                Console.WriteLine(
" List is empty or Position is error! " );
                
return ;
            }
            
if  (i  ==   1 )
            {
                Node
< T >  q  =   new  Node < T > (item);
                q.Next 
=  head.Next;
                head.Next 
=  q;
                
return ;
            }
            Node
< T >  p  =  head;
            
int  j  =   1 ;
            
while  (p  !=   null   &&  j  <  i)
            {
                p 
=  p.Next;
                
++ j;
            }
            
if  (j  ==  i)
            {
                Node
< T >  q  =   new  Node < T > (item);
                q.Next 
=  p.Next;
                p.Next 
=  q;
            }
        }
        
// 删除单链表的第i个结点
         public  T Delete( int  i)
        {
            
if  (IsEmpty()  ||  i  <   0 )
            {
                Console.WriteLine(
" Link is empty or Position is error! " );
                
return   default (T);
            }
            Node
< T >  q  =   new  Node < T > ();
            
if  (i  ==   1 )
            {
                q 
=  head;
                head 
=  head.Next;
                
return  q.Data;
            }
            Node
< T >  p  =  head;
            
int  j  =   1 ;
            
while  (p.Next  !=   null   &&  j  <  i)
            {
                
++ j;
                q 
=  p;
                p 
=  p.Next;
            }
            
if  (j  ==  i)
            {
                q.Next 
=  p.Next;
                
return  p.Data;
            }
            
else
            {
                Console.WriteLine(
" The ith node is not exist! " );
                
return   default (T);
            }
        }
        
// 获得单链表的第i个数据元素
         public  T GetElem( int  i)
        {
            
if  (IsEmpty())
            {
                Console.WriteLine(
" List is empty! " );
                
return   default (T);
            }
            Node
< T >  p  =   new  Node < T > ();
            p 
=  head;
            
int  j  =   1 ;
            
while  (p.Next  !=   null   &&  j  <  i)
            {

                
++ j;
                p 
=  p.Next;
            }
            
if  (j  ==  i)
            {
                
return  p.Data;
            }
            
else
            {
                Console.WriteLine(
" The ith node is not exist! " );
                
return   default (T);
            }
        }
        
// 在单链表中查找值为value的结点
         public   int  Locate(T value)
        {
            
if  (IsEmpty())
            {
                Console.WriteLine(
" List is Empty! " );
                
return   - 1 ;
            }
            Node
< T >  p  =   new  Node < T > ();
            p 
=  head;
            
int  i  =   1 ;
            
while  ( ! p.Data.Equals(value)  &&  p.Next  !=   null )
            {
                p 
=  p.Next;
                
++ i;
            }
            
return  i;
        }
        
public   void  Display()
        {
            Node
< T >  p  =   new  Node < T > ();
            p 
=   this .head;
            
while (p !=   null )
            {
                System.Console.WriteLine(p.Data);
                p 
=  p.Next;
            }


        }
        
 }

IListDs接口如下:
public   interface  IListDS < T >
{
       
            
int  GetLength();  // 求长度
             void  Clear();  // 清空操作
             bool  IsEmpty();  // 判断线性表是否为空
             void  Append(T item);  // 附加操作
             void  Insert(T item,  int  i);  // 插入操作
            T Delete( int  i);  // 删除操作
            T GetElem( int  i);  // 取表元
             int  Locate(T value);  // 按值查找
            
// void Rervese();
       
}
链表的应用
    
public   class  LinkListApplication
    {
       
        
// 在头部插入结点建立单链表的算法如下:
         public   static  LinkList < int >  CreateLListHead()
        {
            
int  d;
            LinkList
< int >  L  =   new  LinkList < int > ();
            d 
=  Int32.Parse(Console.ReadLine());
            
while  (d  !=   - 1 )
            {
                Node
< int >  p  =   new  Node < int > (d);
                p.Next 
=  L.Head;
                L.Head 
=  p;
                d 
=  Int32.Parse(Console.ReadLine());
            }
            
return  L;
        }
        
// 在尾部插入结点建立单链表的算法如下:
         public   static  LinkList < int >  CreateListTail()
        {
            Node
< int >  R  =   new  Node < int > ();
            
int  d;
            LinkList
< int >  L  =   new  LinkList < int > ();
            R 
=  L.Head;
            d 
=  Int32.Parse(Console.ReadLine());
            
while  (d  !=   - 1 )
            {
                Node
< int >  p  =   new  Node < int > (d);
                
if  (L.Head  ==   null )
                {
                    L.Head 
=  p;
                }
                
else
                {
                    R.Next 
=  p;
                }
                R 
=  p;
                d 
=  Int32.Parse(Console.ReadLine());
            }
            
if  (R  !=   null )
            {
                R.Next 
=   null ;
            }
            
return  L;
        }
       
// 将两表合并成一表的算法实现如下:
         public  LinkList < int >  Merge(LinkList < int >  Ha, LinkList < int >  Hb)
        {
            LinkList
< int >  Hc  =   new  LinkList < int > ();
            Node
< int >  s  = new  Node < int > ();
            Node
< int >  p  =  Ha.Head.Next;
            Node
< int >  q  =  Hb.Head.Next;
            Hc 
=  Ha;
            Hc.Head.Next
=   null ;
            
while  (p  !=   null   &&  q  !=   null )
            {
                
if  (p.Data  <  q.Data)
                {
                    s 
=  p;
                    p 
=  p.Next;
                }
                
else
                {
                    s 
=  q;
                    q 
=  q.Next;
                }
                Hc.Append(s.Data);
            }
            
if  (p  ==   null )
            {
                p 
=  q;
            }
            
while  (p  !=   null )
            {
                s 
=  p;
                p 
=  p.Next;
                Hc.Append(s.Data);
            }
            
return  Hc;
        }
        
// 删除单链表中相同值的结点的算法实现如下:
         public  LinkList < int >  Purge(LinkList < int >  Ha)
        {
            LinkList
< int >  Hb  =   new  LinkList < int > ();
            Node
< int >  p  =  Ha.Head.Next;
            Node
< int >  q  =   new  Node < int > ();
            Node
< int >  s  =   new  Node < int > ();
            s 
=  p;
            p 
=  p.Next;
            s.Next 
=   null ;
            Hb.Head.Next 
=  s;
            
while  (p  !=   null )
            {
                s 
=  p;
                p 
=  p.Next;
                q 
=  Hb.Head.Next;
                
while  (q  !=   null   &&  q.Data  !=  s.Data)
                {
                    q 
=  q.Next;
                }
                
if  (q  ==   null )
                {
                    s.Next 
=  Hb.Head.Next;
                    Hb.Head .Next 
=  s;
                }
            }
            
return  Hb;
        }
    }

 

转载于:https://www.cnblogs.com/hubcarl/archive/2010/04/07/1706365.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值