上文我們討論了一種最簡單的線性結構——順序表,這節我們要討論另一種線性結構——鍊錶。
什麼是鍊錶了,不要求邏輯上相鄰的資料元素在物理儲存位置上也相鄰儲存的線性結構稱之為鍊錶。舉個現實中的例子吧,假如乙個公司召開了**會議的吧,能在北京總公司人看到上海分公司的人,他們就好比是邏輯上相鄰的資料元素,而物理上不相連。這樣就好比是個鍊錶。 鍊錶分為①單鏈表,②單向迴圈鍊錶,③雙向鍊錶,④雙向迴圈鍊錶。
介紹各種各樣鍊錶之前,我們要明白這樣乙個概念。什麼是結點。在儲存資料元素時,除了儲存資料元素本身的資訊外,還要儲存與它相鄰的資料元素的儲存位址資訊。這兩部分資訊組成該資料元素的儲存映像(image),稱為結點(node)。在c語言這些面向過程語言中,實現節點是通過指標的形式,在。net中,是通過模擬指標——類物件巢狀的形式。
然後,首先,介紹單鏈表。如果結點的引用域只儲存該結點直接後繼結點的儲存位址, 則該鍊錶叫單鏈表(singly linked list)。把該引用域叫 next。單鏈表結點的結構如圖所示,圖中 data表示結點的資料域。
現實中,就像一隊盲人過馬路。如圖所示
把單鏈表結點看作是乙個類,類名為 node。單鏈表結點類的實現如下所示。
複製** **如下:
public class node
//構造器
public node(node p)
//構造器
public node(t val)
//構造器
public node()
//資料域屬性
public t data
set }
//引用域屬性
public node next
set }
}下圖是線性表(a1,a2,a3,a4,a5,a6)對應的鏈式儲存結構示意圖。
單鏈錶類 linklist源**的實現說明如下所示。首先申明一下,他繼承與ilistds這個介面。
//這是乙個盲人過馬路的類的模擬
public class linklist : ilistds
set }
//構造器
//開始的時候乙個盲人都沒有,頭結點指向為空的位置。沒有排頭的盲人
public linklist()
//這裡我們求盲人隊伍的長度,從第乙個盲人數起,然後第二個,第三個。就以此類推。。。這樣子盲人的隊伍的長度就得出來了啊。
//求單鏈表的長度
public int getlength()
return len;
}//不讓盲人排隊,就是讓這個隊的頭都不存在
//清空單鏈表
public void cl
//判斷乙個盲人佇列的是不是為空,看他的頭部是不是有人
//判斷單鏈表是否為空
public bool isempty()
else }
//在單鏈表的末尾新增新元素
public void append(t item)
//不懂的,一切盡在圖例中
//如果有人排隊,就從頭遍歷,讓他從沒人的地方加入到隊伍中去並且把這個佇列的指標 指向後面。
p = head;
while (p.next != null)
p.next = q;
不懂的一切盡在圖例中
這個方法的演算法複雜度是o(n)
}//就是在一隊中增加了插隊的人員
//在單鏈表的第i個結點的位置前插入乙個值為item的結點
public void insert(t item, int i)
//是頭結點的位置,就把他的頭執政指向與他,把另外指標與他
if (i == 1)
//不懂的,如圖所示:
//而這個是將其迴圈到佇列相應的位置,在將從頭其插入到這個位置
node p = head;
node r = new node();
int j = 1;
while (p.next != null&& j < i)
if (j == i)
一切盡在圖例中
這個方法的演算法複雜度o(n)
//刪除單鏈表的第i個結點
public t delete(int i)
//是頭結點的 的就返回 第二個節點頂到第乙個節點的位置
node q = new node();
if (i == 1)
此步驟為o(1)
//不是的頭位置的吧,就尋找相應位置的節點,在進行刪除。他這個排隊前面的人指向後面的人。這就是新的隊伍了 沒找到,就返回錯誤。
node p = head;
int j = 1;
while (p.next != null&& j < i)
if (j == i)
else
不懂的如圖所示:
此方法的執行時間複雜度是o(n)
}//獲得單鏈表的第i個資料元素
//知道隊伍 我要查詢出隊伍中第n個人是那位,
public t getelem(int i)
//從圖接點數 第n個的結果了
node p = new node();
p = head;
int j = 1;
while (p.next != null&& j < i)
//有著 則返回 沒有就返回錯誤
if (j == i)
else }
不懂的,一切盡在圖例中。
此方法的時間的複雜度是o(n)
//我要查詢張山的位於隊伍的第幾個位置
//在單鏈表中查詢值為value的結點
public int locate(t value)
node p = new node();
p = head;
int i = 1;
//從頭遍歷 比較器 相等的 返回為相應的索引
while (!p.data.equals(value)&& p.next != null)
不懂的,如圖所示:
return i;
這個演算法複雜度是o(n2)
}這節我們討論鍊錶的基本操作,並且畫圖以證明,下屆中我們將討論雙向鍊錶,環形鍊錶 應用舉例。
本文標題: c#資料結構與演算法揭秘三 鍊錶
本文位址:
C 資料結構與演算法揭秘三
上文我們討論了一種最簡單的線性結構 順序表,這節我們要討論另一種線性結構 鍊錶。介紹各種各樣鍊錶之前,我們要明白這樣乙個概念。什麼是結點。在儲存資料元素時,除了儲存資料元素本身的資訊外,還要儲存與它相鄰的資料元素的儲存位址資訊。這兩部分資訊組成該資料元素的儲存映像 image 稱為結點 node 在...
資料結構與演算法 揭秘
字面意思就是研究資料的一種方法,就是研究資料在程式中組織的一種方法。資料結構就是,元素與元素有一種或者多種關係的集合,在軟體界有一種比較普片的公式就是程式 資料結構 演算法。1 集合 set 和數學的集合一樣,具有唯一性,確定性,無序性。2 線性結構 典型的資料庫二維表,一對一的關係。3 樹形結構 ...
C 資料結構與演算法揭秘一
這裡,我們 來說一說c 的資料結構了。什麼是資料結構。資料結構,字面意思就是研究資料的方法,就是研究資料如何在程式中組織的一種方法。資料結構就是相互之間存在一種或多種特定關係的資料元素的集合。程式界有一點很經典的話,程式設計 資料結構 演算法。用源 來體現,資料結構,就是程式設計。他有哪些具體的關係...