C#模擬鏈表數(shù)據(jù)結(jié)構(gòu)的實(shí)例解析
寫在前面
模塊化編程是大多數(shù)初學(xué)者必經(jīng)之路,然后可能你走向了結(jié)構(gòu)化編程,鏈表是一種典型結(jié)構(gòu)模式,它的出現(xiàn)克服了數(shù)組必須預(yù)先知道大小的缺陷,聽不懂?你只需要記住,鏈表結(jié)構(gòu)非常牛叉就可以了,學(xué)習(xí)這種結(jié)構(gòu)對(duì)我們的邏輯思維有很大提升。
什么是鏈表結(jié)構(gòu)呢?
鏈表是一種物理存儲(chǔ)單元上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu)。比如A->B->C,這種結(jié)構(gòu),我們可以理解為A連接著B,B連接C,像這種結(jié)構(gòu)我們就叫做鏈表結(jié)構(gòu)。對(duì)了,火車的車廂,其實(shí)就是鏈表的結(jié)構(gòu)的最好說(shuō)明
為什么要有鏈表結(jié)構(gòu)呢?
學(xué)過(guò)計(jì)算機(jī)的都知道數(shù)組(Array),數(shù)組常用切好用,但也存在問(wèn)題。首先,數(shù)組必須需要知道空間大?。╥nt[] age = new int[100], 必須聲明長(zhǎng)度),其次,對(duì)于元素之間插入、刪除操作效率很低(如何在數(shù)組中間插入一個(gè)元素?)。
鏈表的出現(xiàn),完美的解決了這些問(wèn)題。
如何實(shí)現(xiàn)鏈表
首先我們需要聲明一種結(jié)構(gòu)
//鏈表結(jié)構(gòu): 構(gòu)造節(jié)點(diǎn) - 連接節(jié)點(diǎn)
//Template
class Node
{
public int num;
//指向下一個(gè)元素
public Node next;
}
//鏈表結(jié)構(gòu): 構(gòu)造節(jié)點(diǎn) - 連接節(jié)點(diǎn)
//Template
class Node
{
public int num;
//指向下一個(gè)元素
public Node next;
}
我們可以把上面的這種結(jié)構(gòu)看做是一個(gè)禮品盒,可以存放整形數(shù)值。
然后我們創(chuàng)建一個(gè)MyList先生,這位先生就使用Node去存放整形物品,而且使用了鏈表結(jié)構(gòu)哦!
class MyList
{
public Node currentNode;
public Node point;
public MyList()
{
currentNode = new Node();
}
//存放物品
public void Add(int value)
{
//第一次
if(point == null)
{
currentNode.num = value;
point = currentNode;
}
else //2 3 4..... 次
{
Node temp = new Node();
temp.num = value;
point.next = temp;
//更新指針
point = temp;
}
}
}
class MyList
{
public Node currentNode;
public Node point;
public MyList()
{
currentNode = new Node();
}
//存放物品
public void Add(int value)
{
//第一次
if(point == null)
{
currentNode.num = value;
point = currentNode;
}
else //2 3 4..... 次
{
Node temp = new Node();
temp.num = value;
point.next = temp;
//更新指針
point = temp;
}
}
}
然后,我們可以在客戶端測(cè)試一下:
public static void Main (string[] args)
{
MyList<int> mList = new MyList<int>();
//添加元素
mList.Add(1);
mList.Add(11);
mList.Add(111);
mList.Add(1111);
while(mList.currentNode != null)
{
Console.WriteLine (mList.currentNode.num);
mList.currentNode = mList.currentNode.next;
}
}
public static void Main (string[] args)
{
MyList<int> mList = new MyList<int>();
//添加元素
mList.Add(1);
mList.Add(11);
mList.Add(111);
mList.Add(1111);
while(mList.currentNode != null)
{
Console.WriteLine (mList.currentNode.num);
mList.currentNode = mList.currentNode.next;
}
}
我們自己定義的一個(gè)整形集合就這樣ok了。它有兩個(gè)優(yōu)點(diǎn):可以存放任意多個(gè)元素!方便元素的插入和刪除。
雙向鏈表的定義和簡(jiǎn)單操作:
雙向鏈表其實(shí)是單鏈表的改進(jìn)。當(dāng)我們對(duì)單鏈表進(jìn)行操作時(shí),有時(shí)你要對(duì)某個(gè)結(jié)點(diǎn)的直接前驅(qū)進(jìn)行操作時(shí),又必須從表頭開始查找。這是由單鏈表結(jié)點(diǎn)的結(jié)構(gòu)所限制的。因?yàn)閱捂湵砻總€(gè)結(jié)點(diǎn)只有一個(gè)存儲(chǔ)直接后繼結(jié)點(diǎn)地址的鏈域,那么能不能定義一個(gè)既有存儲(chǔ)直接后繼結(jié)點(diǎn)地址的鏈域,又有存儲(chǔ)直接前驅(qū)結(jié)點(diǎn)地址的鏈域的這樣一個(gè)雙鏈域結(jié)點(diǎn)結(jié)構(gòu)呢?這就是雙向鏈表。在雙向鏈表中,結(jié)點(diǎn)除含有數(shù)據(jù)域外,還有兩個(gè)鏈域,一個(gè)存儲(chǔ)直接后繼結(jié)點(diǎn)地址,一般稱之為右鏈域;一個(gè)存儲(chǔ)直接前驅(qū)結(jié)點(diǎn)地址,一般稱之為左鏈域。
namespace DounlyLinkedlist
{
//定義雙向鏈表的結(jié)點(diǎn)
public class Node
{
public Object Element;
public Node FLink;
public Node BLink;
public Node()
{
Element = null;
FLink = null;
BLink = null;
}
public Node(Object element)
{
Element = element;
FLink = null;
BLink = null;
}
}
//鏈表操作的類
public class LinkedList
{
public Node Header;
public LinkedList()
{
Header = new Node("Header");
Header.FLink = null;
Header.BLink = null;
}
//查找結(jié)點(diǎn)
private Node Find(Object item)
{
Node Current = new Node();
Current = Header;
while (Current.Element != item)
{
Current = Current.FLink;
}
return Current;
}
//插入結(jié)點(diǎn)
public void InsertNode(Object item,Object postionItem)
{
Node Current = new Node();
Node NewItem = new Node(item);
Current = Find(postionItem);
if (Current != null)
{
NewItem.FLink = Current.FLink;
NewItem.BLink = Current;
Current.FLink = NewItem;
}
}
//刪除結(jié)點(diǎn)
public void Remove(Object item)
{
Node P = Find(item);
if (P.FLink != null)
{
P.BLink.FLink = P.FLink;
P.FLink.BLink = P.BLink;
P.BLink = null;
P.FLink = null;
}
}
//查找雙向鏈表最后一個(gè)結(jié)點(diǎn)元素
private Node FindLast()
{
Node Current = new Node();
Current = Header;
while (!(Current.FLink == null))
{
Current = Current.FLink;
}
return Current;
}
//逆向打印雙向鏈表
public void PrintReverse()
{
Node Current = new Node();
Current = FindLast();
while (!(Current.BLink == null))
{
Console.WriteLine(Current.Element);
Current = Current.BLink;
}
}
//打印雙向鏈表
public void Print()
{
Node Current = new Node();
Current = Header;
while (!(Current.FLink == null))
{
Console.WriteLine(Current.FLink.Element);
Current = Current.FLink;
}
}
}
}
鏈表應(yīng)用場(chǎng)景
應(yīng)用場(chǎng)景:集合(動(dòng)態(tài)數(shù)組)、貪吃蛇、地圖的循環(huán)生成、老虎機(jī)效果等等,鏈表可以幫助我們完成很多事情。
上一篇:Windows服務(wù)編寫(Windows Service,system權(quán)限)程序顯示界面與用戶交互(xp,win7通用)
欄 目:C#教程
下一篇:C#基于TCP協(xié)議的服務(wù)器端和客戶端通信編程的基礎(chǔ)教程
本文標(biāo)題:C#模擬鏈表數(shù)據(jù)結(jié)構(gòu)的實(shí)例解析
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/6554.html
您可能感興趣的文章
- 01-10C#實(shí)現(xiàn)的三種模擬自動(dòng)登錄和提交POST信息的方法
- 01-10C#數(shù)據(jù)結(jié)構(gòu)之隊(duì)列(Quene)實(shí)例詳解
- 01-10C#數(shù)據(jù)結(jié)構(gòu)之順序表(SeqList)實(shí)例詳解
- 01-10C#數(shù)據(jù)結(jié)構(gòu)之單鏈表(LinkList)實(shí)例詳解
- 01-10C#數(shù)據(jù)結(jié)構(gòu)之堆棧(Stack)實(shí)例詳解
- 01-10C#數(shù)據(jù)結(jié)構(gòu)之雙向鏈表(DbLinkList)實(shí)例詳解
- 01-10C#使用ImitateLogin模擬登錄百度
- 01-10C#模擬http 發(fā)送post或get請(qǐng)求的簡(jiǎn)單實(shí)例
- 01-10C#常用數(shù)據(jù)結(jié)構(gòu)和算法總結(jié)
- 01-10C#實(shí)現(xiàn)單鏈表(線性表)完整實(shí)例


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10C#通過(guò)反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁(yè)無(wú)法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過(guò)重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什


