开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1332|回复: 0
收起左侧

[C#图文教程] 转载 C#如何实现双向链表

[复制链接]

结帖率:100% (6/6)
发表于 2013-2-17 23:55:24 | 显示全部楼层 |阅读模式   广东省东莞市
1        <P> </P>
2        双向链表的算法描述和单向链基本相同,但是双向链表在删除和插入时与单向链表有很大的不同。

view sourcePRint?1        双向链表在删除结点时,不但要修改结点的直接后继指针,还要同时修改结点的直接前驱指针。

view sourceprint?1        在插入时更是要修改插入结点的前驱和后继的两个方向上的指针。具体代码如下:


view sourceprint?01        public class Objects  
02        {  
03             private int number;   
04             private string name;  
05             private int counter;  
06             //构造函数  
07             public Objects(int num, string Name, int count)  
08             {  
09                 number = num;  
10                 name = Name;  
11                 counter = count;  
12             }  
13             public int Number  
14             {  
15                 get
16                 {  
17                     return number;  
18                 }  
19                 set
20                 {  
21                     number = value;  
22                 }  
23             }  
24             public string Name  
25             {  
26                 get
27                 {  
28                     return name;  
29                 }  
30                 set
31                 {  
32                     name = value;  
33                 }  
34             }  
35             public int Counter  
36             {  
37                 get
38                 {  
39                     return counter;  
40                 }  
41                 set
42                 {  
43                     counter = value;  
44                 }  
45             }  
46        }

代码
//结点类
public class ListNode
{
  public ListNode(Objects bugs)
  {
      goods = bugs;
  }
  /**/
  /// <summary>
  /// 前一个
  /// </summary>      
  public ListNode Previous;
  /**/
  /// <summary>
  /// 后一个
  /// </summary>
  public ListNode Next;
  public ListNode next
  {
      get
      {
          return Next;
      }
      set
      {
          Next = value;
      }
  }
  /**/
  /// <summary>
  /// 值
  /// </summary>
  public Objects goods;
  public Objects Goods
  {
      get
      {
          return goods;
      }
      set
      {
          goods = value;
      }
  }
}

在asp.net 中的双向链表的实现

定义链表中的节点的代码如下。
代码
pic class Clists
{
  public Clists()
  {
      //构造函数
      //初始化
      ListCountValue = 0;
      Head = null;
      Tail = null;
  }
  /**/
  /// <summary>
  /// 表名
  /// </summary>
  private string clistname = "";
  public string ClistName
  {
      get
      {
          return clistname;
      }
      set
      {
          clistname = value;
      }
  }
  /**/
  /// <summary>
  /// 头指针
  /// </summary>
  private ListNode Head;
  
  /**/
  /// <summary>
/// 尾指针
/// </summary>
private ListNode Tail;
  
/**/
/// <summary>
/// 当前指针
/// </summary>   
private ListNode Current;
public ListNode current
{
    get
    {
        return Current;
    }
    set
    {
        Current = value;
    }
}
  
/**/
/// <summary>
/// 链表数据的个数
/// </summary>  
private int ListCountValue;
在链表尾部添加数据的实现代码如下。
/**/
/// <summary>
/// 尾部添加数据
/// </summary>
public void Append(Objects 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;
            Tail.next = null;
            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;
    else
    return false;
}
/**/
/// <summary>
/// 判断是否为到达尾部
/// </summary>
public bool IsEof()
{
    if (Current == Tail)
    return true;
    else
    return false;
}
/**/
/// <summary>
/// 判断是否为到达头部
/// </summary>
public bool IsBof()
{
    if (Current == Head)
     return true;
    else
    return false;
}
public Objects GetCurrentValue()
{
    return Current.goods;
}
/**/
/// <summary>
/// 取得链表的数据个数
/// </summary>
  
public int ListCount
{
    get
    {
        return ListCountValue;
    }
}
清空链表的实现代码如下。


/**/
/// <summary>
/// 清空链表
/// </summary>
public void Clear()
{
    MoveFrist();
    while (!IsNull())
    {
        //若不为空链表,从尾部删除
        Delete();
    }
}
在当前位置前插入数据的代码如下。


/// <summary>
/// 在当前位置前插入数据
/// </summary>
public void Insert(Objects 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(Objects InsertValue)
{
    //参数:InsertValue 插入的数据
    //为空链表
    if (IsNull())
    {
        //添加
        Append(InsertValue);
        return;
    }
    //移动到头
    MoveFrist();
    if ((InsertValue.Number < GetCurrentValue().Number))
    {
        //满足条件,则插入,退出
        Insert(InsertValue);
        return;
    }
    while (true)
    {
        if (InsertValue.Number < GetCurrentValue().Number)
        {
            //满族条件,则插入,退出
            Insert(InsertValue);
            break;
        }
        if (IsEof())
        {
            //尾部添加
            Append(InsertValue);
            break;
        }
        //移动到下一个指针
        MoveNext();
    }
}
进行降序插入的代码如下。

  /**/
  /// <summary>
  /// 进行降序插入
  /// </summary>
  
  /**/
  /*货物入库*/
  public void InsertUnAscending(Objects InsertValue)
  {
      //参数:InsertValue 插入的数据
      //为空链表
      if (IsNull())
      {
          //添加
          Append(InsertValue);
          return;
      }
      //移动到头
      MoveFrist();
      if (InsertValue.Number > GetCurrentValue().Number)
      {
          //满足条件,则插入,退出
          Insert(InsertValue);
          return;
      }
      while (true)
      {
          if (InsertValue.Number > GetCurrentValue().Number)
          {
              //满足条件,则插入,退出
              Insert(InsertValue);
              break;
          }
          if (IsEof())
          {
              //尾部添加
              Append(InsertValue);
              break;
          }
          //移动到下一个指针
          MoveNext();
您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表