2007年最後一個月在忙碌度過了,最近在網上下了一本C#版本的數據結構的電子書,正好我也打算在把數據結構在過一遍,剛好可以看這本,還可以提高一下英文的閱讀能力。
書名是《DATA STRUCTURES AND ALGORITHMS USING C#》,作者:MICHAEL MCMILLAN
以後我會陸續把這本數的心得發上來,同時也把自己親手實踐過的代碼發上來,大家一起學習,一起進步。如果有什麼錯誤,大家可以發郵件或者留言給我。謝謝。由於該書的結構和我們一般教材的結構不是很一樣,所以我按照一般教材的順序,先從鏈表開始,原書鏈表是在第十一章才講的。書中代碼有問題的地方我會在注釋中標注出來。
namespace DataStruct
...{
//定義單鏈表的表頭
public class Node
...{
//存儲數據,定義為基類,可以存不同類型的數據
public Object Element;
//指向下一個結點的引用
public Node Link;
//構造空結點
public Node()
...{
this.Element = null;
this.Link = null;
}
//帶參數的構造器
public Node(Object element)
...{
this.Element = element;
this.Link = null;
}
}
public class LinkedList
...{
//此處原書有誤,不應該設置為peotected,這樣會導致結點沒有實例化
public Node Header;
public LinkedList()
...{
Header = new Node("header");
}
//查找鏈表中的元素
private Node Find(Object item)
...{
Node Current = new Node();
Current = Header;
//書中此處代碼有誤
//while(Current.header !=item)
while (Current.Element != item)
...{
Current = Current.Link;
}
return Current;
}
//在鏈表中插入元素
public void InsertNode(Object newItem,Object after)
...{
Node Current = new Node();
Node NewNode = new Node(newItem);
Current = Find(after);
if (Current != null)
...{
NewNode.Link = Current.Link;
Current.Link = NewNode;
}
}
public Node FindPrevious(Object n)
...{
Node Current = Header;
while (!(Current.Link == null) && (Current.Link.Element != n))
...{
Current = Current.Link;
}
return Current;
}
//刪除結點
public void Remove(Object item)
...{
Node P = FindPrevious(item);
if (!(P.Link == null))
...{
P.Link = P;
}
}
//打印鏈表
public void PrintList()
...{
Node Current = new Node();
Current = this.Header;
while (Current.Link != null)
...{
Console.WriteLine(Current.Link.Element);
Current = Current.Link;
}
}
}
class Program
...{
static void Main(string[] args)
...{
//實例化結點
Node FirstNode = new Node("Tommy");
Node SecondNode = new Node("weiwei");
Int32 Num = 5;
//因為我們定義結點的時候是用object類型,所以結點可以存儲不同類型
Node ThirdNode = new Node(Num);
FirstNode.Link = SecondNode;
SecondNode.Link = ThirdNode;
ThirdNode.Link = null;
LinkedList MyList = new LinkedList();
//將頭結點指向第一個結點
MyList.Header.Link = FirstNode;
//插入結點
MyList.InsertNode("advantech", "weiwei");
MyList.InsertNode("插入鏈表", "Tommy");
//打印鏈表中的結點元素
MyList.PrintList();
Console.ReadLine();
}
}
}