首页 > 开发 > 综合 > 正文

C#数据结构篇(一链表类) killertang(原作)

2024-07-21 02:28:06
字体:
来源:转载
供稿:网友
c#数据结构篇(一)线性表



          作者: 寒羽狼 (dark_slaer_tang)







            最近,马子跑了,你说女人老是容易翻脸。。。,看来做程序员必定要 “茕茕孑立,行影相吊”悲惨命运了。还是老老实实编程吧,我发现用c# 编一些数据接结构的类也瞒不错的,于是想把数据结构的算法,用c#重写一遍,打发无聊的时光,下面是数据结构中的链表的实现。



       首先定义结点类型,定义了,前一个指针域,后一个指针域,如下:







using system;



namespace list
{
/// <summary>
/// summary description for listnode.
/// </summary>



// 结点类




public class listnode
{
  public listnode(int newvalue)
  {
   value=newvalue;
  }



  /// <summary>
  /// 前一个
  /// </summary>



     
  public listnode previous;




  /// <summary>
  /// 后一个
  /// </summary>




  public listnode next;




  /// <summary>
  /// 值
  /// </summary>




  public int value;
}
}



using system;

namespace list
{


/// <summary>
/// 链表类
/// </summary>

定义结点之后,开始类线性表的操作编程了.在list 类中,采用了,head ,tail,  current,三个指针,使用append ,movefrist,moveprevious,movenext,movelast ,delete,insertascending,insertunascending ,clear 实现移动,添加,删除,升序插入,降序插入,清空链表操作,getcurrentvalue() 方法取得当前的值。


public class clist
{
  public clist()

  {

   //构造函数

   //初始化


   listcountvalue=0;

   head=null;

   tail=null;


  }


  /// <summary>
  /// 头指针
  /// </summary>


  private listnode head;


  /// <summary>
  /// 尾指针
  /// </summary>
  
  private listnode tail;

  /// <summary>
  /// 当前指针
  /// </summary>
  
  private listnode current;

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

  /// <summary>
  /// 尾部添加数据
  /// </summary>

  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>


  public bool isnull()
  {
   if (listcountvalue==0)
   return true;

   return false;
  }

  /// <summary>
  /// 判断是否为到达尾部
  /// </summary>
  
  public bool iseof()
  {
   if( current  ==tail )
   return true;

   return false;
  }

  /// <summary>
  /// 判断是否为到达头部
  /// </summary>
  

  public bool isbof()
  {
   if( current ==head)
    return true;

      return false;

  }

  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>
  
  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>
  
  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();

   }
     }


  /// <summary>
  /// 进行降序插入
  /// </summary>


  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();

   }
  }
}
}






       好了,一个简单的链表类实现了,当然还有许多的功能,可以根据自己的需要添加就好了。to be conti
注册会员,创建你的web开发资料库,
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表