博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

数据结构课程设计-----用C#实现双向链表

Posted on 2006-03-11 00:41  OOspurs  阅读(4410)  评论(14编辑  收藏  举报
          学校要我们做数据结构的课程设计线性表的应用——仓库管理图的应用——工程工期控制问题.一向以来编这些算法程序都是用C或C++语言来写的,这次我决定做一个新尝试用C#来编这两个算法,并配以图形界面来显示效果.下面是我写的双向链表类.
using System;
using
 System.Collections.Generic;
using
 System.Text;



namespace
 LJH.ListNode
{

    
public class
 Objects
    
{
        
private int number;          /* 货物编号 */

        
private string name;      /* 货物名称 */
        
private int counter;        /* 货物数量 */

        
//构造函数
        public Objects(int num, string Name, int count)
        
{
            number 
=
 num;
            name 
=
 Name;
            counter 
=
 count;
        }

        
public int Number
        
{
            
get

            
{
                
return
 number;
            }

            
set
            
{
                number 
=
 value;
            }

        }

        
public string Name
        
{
            
get

            
{
                
return
 name;
            }

            
set
            
{
                name 
=
 value;
            }

        }

        
public int Counter
        
{
            
get

            
{
                
return
 counter;
            }

            
set
            
{
                counter 
=
 value;
            }

        }

    }


    
// 结点类
    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;
            }

        }

        

    }


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

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

            }

        }

        
//根据名字查询货物
        public Objects FindObjects(string name)
        
{
            ListNode lnode 
=
 Head;
            
if
 (IsNull())
            
{
                
return null
;
            }

            
else if (IsEof())
            
{
                
return null
;
            }

            
else
                
while (lnode.goods.Name != name)
                
{
                    
if (lnode.Next == null
)
                    
{
                        Current 
=
 lnode;
                        
return null
;
                    }

                    lnode 
= lnode.Next;
                }

            Current 
= lnode;
            
return
 lnode.goods;
        }

        
//根据编号查询货物
        public Objects FindObjects(int number)
        
{
            ListNode lnode 
=
 Head;
            
if
 (IsNull())
            
{
                
return null
;
            }

            
else if (IsEof())
            
{
                
return null
;
            }

            
else
                
while (lnode.goods.Number != number)
                
{
                    
if (lnode.Next == null
)
                    
{
                        Current 
=
 lnode;
                        
return null
;
                    }

                    lnode 
= lnode.Next;
                }

            Current 
= lnode;
            
return
 lnode.goods;
        }


        
/*货物出库*/
        
//根据名字删除货物
        public Objects DeleteObjects(string name)
        
{
            Objects bugs;
            bugs 
=
 FindObjects(name);
            Delete();
            
return
 bugs;
        }

        
//根据编号删除货物
        public Objects DeleteObjects(int number)
        
{
            Objects bugs;
            bugs 
=
 FindObjects(number);
            Delete();
            
return
 bugs;
        }

    }

}