VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > temp > C#教程 >
  • c#实现单向链表

制作者:剑锋冷月 单位:无忧统计网,www.51stat.net
 

  链表是一种重要的数据结构,该结构由节点组成。每个节点包含两部分数据,第一部分是节点本身的数据,第二部分是指向下一个节点的指针。对于单向链表,链表中存在两个特殊的节点,分别为“头节点”和“尾节点”。头节点本身没有数据,只存储下一个节点的指针,尾节点只存储数据。结点的定义及对线性表的操作如下:

  首先,定义一个结点类用于对结点的描述。其中,私有成员Value用于储存节点本身的数据,Next用于存储下一个节点的指针,Previous用于存储上一个节点的指针。对于链表的操作,无非是进行节点的查找、插入和删除操作。代码如下:

// 结点类
    publicclassListNode
    {
      publicListNode(intNewValue)//,intNewCurrent)
      {
        Value=NewValue;
        //Current=NewCurrent;
      }
      //前一个
      publicListNodePrevious; 
      //后一个
      publicListNodeNext;
      //值
      publicintValue;
      ////指针
      //publicintCurrent;
    }

  然后定义了一个Clist类,主要对线性表基本操作的编程。其中包括,Head、Tail、Current三个指针和Append、MoveFrist、MovePrevious、MoveNext、MoveLast、Delete、InsertAscending、InsertUnAscending、Clear、 GetCurrentValue方法,用于实现移动、添加、删除、升序插入、降序插入、清空链表、取得当前的值等操作。代码如下://定义结点之后,开始类线性表的操作编程了.在ClIST类中,采用了,Head,Tail, Current,三个指针,使用Append,MoveFrist,MovePrevious,MoveNext,MoveLast,Delete,InsertAscending,InsertUnAscending,Clear实现移动,添加、删除,升序插入,降序插入,清空链表操作,GetCurrentValue()方法取得当前的值。
publicclassClist
{
///<summary>
///初始化线性表
///</summary>
publicClist()
{
  //构造函数
  //初始化
  ListCountValue=0;
  Head=null;
  Tail=null;
}
//头指针
privateListNodeHead; 
//尾指针 
privateListNodeTail; 
//当前指针
privateListNodeCurrent; 
//链表数据的个数
privateintListCountValue;

  在链表尾部添加数据的代码如下:  //尾部添加数据 
///<summary>
///尾部添加数据
///</summary>
///<paramname="DataValue"></param>
publicvoidAppend(intDataValue)//,intDataCurrent)
{
  ListNodeNewNode=newListNode(DataValue);//,DataCurrent);
  if(IsNull())
  //如果头指针为空
  {
    Head=NewNode;
    Tail=NewNode;
  }
  else
  {
    Tail.Next=NewNode;
    NewNode.Previous=Tail;
    Tail=NewNode;
  }
  Current=NewNode;
  //链表数据个数加一
  ListCountValue+=1;
  }

  删除当前位置的结点的代码如下://删除当前的数据
///<summary>
///删除当前的数据
///</summary>
publicvoidDelete()
{
  //若为空链表
  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>
publicvoidMoveNext()
{
  if(!IsEof())Current=Current.Next;
}

  向前移动一个结点的代码如下://向前移动一个数据
///<summary>
///向前移动一个数据
///</summary>
publicvoidMovePrevious()
{
  if(!IsBof())Current=Current.Previous;
}

  移动到第一个结点的代码如下://移动到第一个数据 
///<summary>
///移动到第一个数据
///</summary>
publicvoidMoveFrist()
{
  Current=Head;
}

  移动到最后一个结点的代码如下://移动到最后一个数据
///<summary>
///移动到最后一个数据
///</summary>
publicvoidMoveLast()
{
  Current=Tail;
}

  判断链表是否为空的代码如下://判断是否为空链表
///<summary>
///判断是否为空链表
///</summary>
///<returns></returns>
publicboolIsNull()
{
  if(ListCountValue==0)
    returntrue;
 
  returnfalse;
}

  判断是否为链表的尾部的代码如下://判断是否为到达尾 
///<summary>
///判断是否为到达尾
///</summary>
///<returns></returns>
publicboolIsEof()
{
  if(Current==Tail)
    returntrue;
  returnfalse;
}

  判断是否为链表的头部的代码如下://判断是否为到达头部
///<summary>
///判断是否为到达头部
///</summary>
///<returns></returns>
publicboolIsBof()
{
  if(Current==Head)
    returntrue;
  returnfalse;
}

  获取当前位置的值的代码如下:///<summary>
///获取当前位置的值
///</summary>
///<returns></returns>
publicintGetCurrentValue()
{
  returnCurrent.Value;
}

  获取链表的结点数的代码如下://取得链表的数据个数
///<summary>
///取得链表的数据个数
///</summary>
publicintListCount
{
  get
  {
    returnListCountValue;
  }
}

  清空链表的代码如下://清空链表
///<summary>
///清空链表
///</summary>
publicvoidClear()
{
  MoveFrist();
  while(!IsNull())
  {
    //若不为空链表,从尾部删除 
    Delete();
  }
}

  在当前位置前插入结点的代码如下://在当前位置前插入数据
///<summary>
///在当前位置前插入数据
///</summary>
///<paramname="DataValue"></param>
publicvoidInsert(intDataValue)
{
  ListNodeNewNode=newListNode(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>
///<paramname="InsertValue"></param>
publicvoidInsertAscending(intInsertValue)
{
  //参数: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>
///<paramname="InsertValue"></param>
publicvoidInsertUnAscending(intInsertValue)
{
  //参数: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();
  }
}



相关教程