C#資料結構篇(一連結串列類) (轉)

worldblog發表於2007-12-13
C#資料結構篇(一連結串列類) (轉)[@more@]

      資料結構篇(一)線性表


  作者: 寒羽狼 (Dark_Slaer_Tang)


 


 最近,馬子跑了,你說女人老是容易翻臉。。。,看來做員必定要 “煢煢孑立,行影相吊”悲慘命運了。還是老老實實吧,我發現用c# 編一些資料接結構的類也瞞不錯的,於是想把資料結構的演算法,用C#重寫一遍,打發無聊的時光,下面是資料結構中的連結串列的實現。


  首先定義結點型別,定義了,前一個指標域,後一個指標域,如下:


 


using System;


namespace List
{
 ///


 /// Summary description for ListNode.
 ///


// 結點類



 public class ListNode
 {
 public ListNode(int NewValue)
 {
 Value=NewValue;
 }


 ///


 /// 前一個
 ///


 
 public ListNode Previous;



 ///


 /// 後一個
 ///



 public ListNode Next;



 ///


 /// 值
 ///



 public int Value;
 }
}


using System;

namespace List
{


 ///


 /// 連結串列類
 ///

定義結點之後,開始類線性表的操作程式設計了.在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;


 }


 ///


 /// 頭指標
 ///


 private ListNode Head;


 ///


 /// 尾指標
 ///

 
 private ListNode Tail;

 ///


 /// 當前指標
 ///

 
 private ListNode Current;

 ///


 /// 連結串列資料的個數
 ///

 
 private int ListCountValue;

 ///


 /// 尾部新增資料
 ///

 
 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;

 }
 
 ///


 /// 刪除當前的資料
 ///


 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;
 }

 
 }


 ///


 /// 向後移動一個資料
 ///


 public void MoveNext()
 {
  if (! IsEof()) Current=Current.Next ;
 }
 ///


 /// 向前移動一個資料
 ///

 
 public void MovePrevious()
 {
 if (!IsBof()) Current=Current.Previous  ;
 }

 ///


 /// 移動到第一個資料
 ///

 
 public void MoveFrist()
 {
  Current=Head;
 }

 ///


 /// 移動到最後一個資料
 ///


 public void MoveLast()
 {
 Current=Tail;
 }

 ///


 /// 判斷是否為空連結串列
 ///


 public bool IsNull()
 {
 if (ListCountValue==0)
 return true;

 return false;
 }

 ///


 /// 判斷是否為到達尾部
 ///

 
 public bool IsEof()
 {
 if( Current  ==Tail )
 return true;

 return false;
 }

 ///


 /// 判斷是否為到達頭部
 ///

 

 public bool IsBof()
 {
 if( Current ==Head)
 return true;

  return false;

 }

 public int GetCurrentValue()
 {
 
 return Current.Value ;

 }
 
 ///


 /// 取得連結串列的資料個數
 ///

 
 public int ListCount
 {
 get
 {
 return ListCountValue;
 }
 }

 ///


 /// 清空連結串列
 ///

 
 public void Clear()
 { 
 MoveFrist();
 while (!IsNull())
 {
 //若不為空連結串列,從尾部刪除
 
 Delete();

 }
 }

 ///


 /// 在當前位置前插入資料
 ///

 
 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;

 }

 ///


 /// 進行升序插入
 ///

 
 public void InsertAscending(int InsertValue)
 {
  //引數:InsertValue 插入的資料
 
 
  //為空連結串列

 if (IsNull())
 { 
 //新增

 Append(InsertValue);

 return;

 }

  //移動到頭

  MoveFrist();
 
 if ((InsertValue   { 
 //滿足條件,則插入,退出

 Insert(InsertValue);

 return;

 }

  while(true)

 { 
 
 if (InsertValue {

 //滿族條件,則插入,退出

 Insert(InsertValue);

 break;

 }

 if (IsEof())
 { 
 //尾部新增

 Append(InsertValue);

 break;

 }

  //移動到下一個指標

 MoveNext();

 }
   }


 ///


 /// 進行降序插入
 ///


 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 CONTINUE 。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992422/,如需轉載,請註明出處,否則將追究法律責任。

相關文章