今天开博了2007-7-16

开博没有太监的客。。。

 

c#数据结构研究———链表1

现在的开发越来越简单,我注意到网上很少有介绍c#数据结构的,所以我把我学习的一些东西发出来与大家一起研讨。
链表的实现:

using System;

namespace LinkedListLibrary

{

     //定义节点

     class ListNode

     {

          private object data;        //数据

          private ListNode next;      //指向下一个节点

          public ListNode(object dataValue)

               :this(dataValue,null)

          {

          //初始化

          }

          public ListNode(object dataValue,ListNode nextNode)

          {

               data = dataValue;

               next = nextNode;

          }

          #region ListNode属性

          public object Data

          {

               get

               {

                    return data;

               }

               set

               {

                    data = value;

               } 

          }

          public ListNode Next

          {

               get

               {

                    return next;

               }

               set 

               {

                    next = value;

               }

          }

          #endregion

     }

     public class List

     {

          private ListNode firstNode;

          private ListNode lastNode;

          private string name;//链表的名字

         

          public List():this("list")

          {

          }

          public List(string listName)

          {

               name = listName;

               firstNode = lastNode = null;

          }

          //在链表头插入

          public void InsertAtFront(object insertItem)

          {

               lock(this)

               {

                    if(IsEmpty())

                         firstNode = lastNode = new ListNode(insertItem);

                    else

                         firstNode = new ListNode(insertItem,firstNode);

               }

          }

          //在表尾插入

          public void InsertAtBack(object insertItem)

          {

               lock(this)

               {

                    if(IsEmpty())

                         firstNode = lastNode = new ListNode(insertItem);

                    else

                         lastNode = lastNode.Next = new ListNode(insertItem);

               }

          }

          //移出表头数据

          public object RemoveFromFront()

          {

               lock(this)

               {

                    if(IsEmpty())

                         throw new EmptyListException(name);

                    object removeItem = firstNode.Data;//重新得到数据

                    if(firstNode == lastNode)

                    {

                         firstNode = lastNode = null;

                    }

                    else

                         firstNode = firstNode.Next;

                         return removeItem;

               }

          }

          //移出表尾数据

          public object RemoveFromBack()

          {

               lock(this)

               {

                    if(IsEmpty())

                         throw new EmptyListException(name);

                    object removeItem = lastNode.Data;

                    if(firstNode == lastNode)

                    {

                         firstNode = lastNode = null;

                    }

                    else

                    {

                         ListNode current = firstNode;

                         while(current.Next != lastNode)

                              current = current.Next;//移动到下一节点

                         lastNode = current;

                         current.Next = null;

                    }

                    return removeItem;

               }

          }

          //判断是不是为空

          public bool IsEmpty()

          {

               lock(this)

                    return firstNode == null;

          }

          //显示链表

          virtual public void Print()

          {

               lock(this)

               {

                    if(IsEmpty())

                    {

                         Console.WriteLine("Empty "+name);

                         return;

                    }

                    Console.Write("the "+name+" is:");

                    ListNode current = firstNode;

                    while(current != null)

                    {

                         Console.Write(current.Data +" ");

                         current = current.Next;

                    }

                    Console.Write("\n");

               }

          }

     }

     //自定义异常

     public class EmptyListException:ApplicationException

     {

          public EmptyListException(string name)

               :base("the "+name+" is Empty")

          {

          }

     }

}
这里只是实现了链表的基本基本操作,下面给出调用函数:

using System;

using LinkedListLibrary;

namespace ListText

{

     public class ListText

     {

          public static void Main(string []args)

          {

               List list = new List();

               bool aBoolean = true;

               char aCharacter = '$';

               int anInteger = 34567;

               string aString = "hello";

               //利用List的方法

               list.InsertAtFront(aBoolean);

               list.Print();

               list.InsertAtFront(aCharacter);

               list.Print();

               list.InsertAtBack(anInteger);

               list.Print();

               list.InsertAtBack(aString);

               list.Print();

               //使用移出方法

               object removedObject;

               try

               {

                    removedObject = list.RemoveFromFront();

                    Console.WriteLine(removedObject+" removed");

                    list.Print();

                    removedObject = list.RemoveFromFront();

                    Console.WriteLine(removedObject+" removed");

                    list.Print();

                    removedObject = list.RemoveFromBack();

                    Console.WriteLine(removedObject+" removed");

                    list.Print();

                    removedObject = list.RemoveFromBack();

                    Console.WriteLine(removedObject+" removed");

                    list.Print();

               }

               catch(EmptyListException emptyListException)

               {

                    Console.Error.WriteLine("\n"+emptyListException);

               }

          }        

     }

}

通过这个类来调用链表。
结果:

the list is:True

the list is:$ True

the list is:$ True 34567

the list is:$ True 34567 hello

$ removed

the list is:True 34567 hello

True removed

the list is:34567 hello

hello removed

the list is:34567

34567 removed

Empty list

后面我将把其他操作列出来。希望大家指导。(阅读:c#高级程序员指南)

posted on 2005-04-21 17:51  胡敏  阅读(3256)  评论(4编辑  收藏  举报

导航