C 資料結構與演算法揭秘12

2021-09-23 21:27:22 字數 3704 閱讀 8556

這節,我們來重點討論一下 這個樹形結構的相應的源**的實現了。

真的我們首先介紹一下無向圖鄰接錶類的實現來說明圖的鄰接錶類的實現。 

無向圖鄰接表的鄰接表結點類 adjlistnode有兩個成員字段,乙個是1adjvex,儲存鄰接頂點的資訊,型別是整型;乙個是 next,儲存下乙個鄰接表結點的位址,型別是 adjlistnode。adjlistnode的實現如下所示。

public class adjlistnode

set }

//下乙個鄰接表結點屬性

public adjlistnodenext

set }

//構造器    指向 鄰接頂點

//下乙個結點為空。

public adjlistnode(int vex)

具體情況,如圖所示:

}而具體的圖連線表應該是這樣的。

無向圖鄰接表的頂點結點類 vexnode有兩個成員字段,乙個 data,它儲存圖的頂點本身的資訊,型別是 node;乙個是 firstadj,儲存頂點的鄰接表的第1個結點的位址,型別是 adjlistnode。vexnode的實現如下所示。

public class vexnode

set }

//鄰接表的第1個結點屬性

public adjlistnodefirstadj

set }

//構造器

public vexnode()

//構造器

public vexnode(nodend)

//構造器

public vexnode(nodend, adjlistnodealnode)

這個具體的情況,如圖所示:

}無向圖鄰接錶類 graphadjlist有乙個成員字段 adjlist, 表示鄰接表陣列,陣列元素的型別是 vexnode。 graphadjlist實現了介面 igraph中的方法。與無向圖鄰接矩陣類 graphadjmatrix一樣,graphadjlist實現了兩個成員方法 isnode 和 getindex。功能與 graphadjmatrix一樣。無向圖表graphadjlist的源**實現如下所示。

public class graphadjlist: igraph

set }

//構造器 構建成乙個相應的圖表

public graphadjlist(node nodes) }

//獲取頂點的數目

public int getnumofvertex()

演算法思路:求無向圖的頂點數比較簡單,直接返回 adjlist 陣列的長度就可以了。演算法的複雜度是o(1)

//獲取邊的數目

public int getnumofedge() }

return i / 2;

} 演算法思路:求無向圖的邊數比求頂點數要複雜一些,需要求出所有頂點的鄰接表的結點的個數,然後除以2。演算法的時間的複雜度是o(n2)

//判斷v是否是圖的頂點

public bool isnode(nodev) }

return false;

} 演算法思路:首先判斷頂點 v1 和 v2 是否是圖的頂點。如果 v1 和 v2 不是圖的頂點,不作處理。否則,在頂點 v1(或 v2)的鄰接表中查詢是否存在 adjvex的值等於 v2(或 v1)在 adjlist 中的序號的結點,如果存在,則返回 true,否則返回 false。

//獲取頂點v在鄰接表陣列中的索引

public int getindex(nodev) }

return i;

} //在頂點v1和v2之間新增權值為v的邊

public void setedge(nodev1, nodev2,int v)

//權值不對

if(v != 1)

//處理頂點v1的鄰接表

adjlistnodep = new adjlistnode(getindex(v2));

//頂點v1沒有鄰接頂點

if (adjlist[getindex(v1)].firstadj == null)

//頂點v1有鄰接頂點

else

//處理頂點v2的鄰接表

p = new adjlistnode(getindex(v1));

//頂點v2沒有鄰接頂點

if (adjlist[getindex(v2)].firstadj == null)

//頂點v1有鄰接頂點

else }

演算法思路: 首先判斷頂點 v1 和 v2 是否是圖的頂點和 v1 和 v2 是否存在邊。如果 v1 和 v2 不是圖的頂點和 v1 和 v2 存在邊,不作處理。然後,判斷 v 的值是否為1, 為1不作處理。 否則, 先分配乙個鄰接表結點, 其adjvex域是v2在adjlist陣列中的索引號,然後把該結點插入到頂點 v1 的鄰接表的表頭;然後再分配乙個鄰接表結點,其 adjvex 域是 v1 在 adjlist 陣列中的索引號,然後把該結點插入到頂點 v2 的鄰接表的表頭。

本演算法是把鄰接表結點插入到頂點鄰接表的表頭,當然,也可以插入到鄰接表的表尾,或者按照某種要求插入,只是對插入這個操作而言,在表的頭部插入是最簡單的,而本書在後面關於圖的處理,如圖的深度優先遍歷和廣度優先遍歷等,對圖的頂點沒有特殊要求,所以採用了在鄰接表的頭部插入結點。如果對圖的頂點有特殊要求,則需要按照一定的要求進行插入,需要修改這裡的**。由於存在迴圈遍歷,所以的演算法的時間的複雜度是o(n2)

//刪除頂點v1和v2之間的邊

public void deledge(nodev1, nodev2)

//頂點v1與v2之間有邊

if (isedge(v1,v2)) }

pre.next = p.next;

//處理頂點v2的鄰接表中的頂點v1的鄰接表結點

p = adjlist[getindex(v2)].firstadj;

pre = null;

while (p != null) }

演算法思路:首先判斷頂點 v1 和 v2 是否是圖的頂點以及 v1 和 v2 是否存在邊。如果 v1 和 v2 不是圖的頂點或 v1 和 v2 不存在邊,不作處理。否則,先在頂點 v1 的鄰接表中刪除 adjvex 的值等於頂點 v2 在 adjlist 陣列中的序號結點,然後刪除頂點 v2 的鄰接表中 adjvex 的值等於頂點 v1 在 adjlist 陣列中的序號結點。由於用到了遍歷的,時間的複雜度是o(n2)

//判斷v1和v2之間是否存在邊

public bool isedge(nodev1, nodev2)

adjlistnodep = adjlist[getindex(v1)].firstadj;

while (p != null)

p = p.next;

} return false;

} 具體情況,如圖所示:

資料結構與演算法 揭秘

字面意思就是研究資料的一種方法,就是研究資料在程式中組織的一種方法。資料結構就是,元素與元素有一種或者多種關係的集合,在軟體界有一種比較普片的公式就是程式 資料結構 演算法。1 集合 set 和數學的集合一樣,具有唯一性,確定性,無序性。2 線性結構 典型的資料庫二維表,一對一的關係。3 樹形結構 ...

C 資料結構與演算法揭秘一

這裡,我們 來說一說c 的資料結構了。什麼是資料結構。資料結構,字面意思就是研究資料的方法,就是研究資料如何在程式中組織的一種方法。資料結構就是相互之間存在一種或多種特定關係的資料元素的集合。程式界有一點很經典的話,程式設計 資料結構 演算法。用源 來體現,資料結構,就是程式設計。他有哪些具體的關係...

C 資料結構與演算法揭秘13

這節,我們來看看一下什麼了,來看看圖的遍歷吧!首先,搞清楚,圖的遍歷的基本的含義了。圖的遍歷是指從圖中的某個頂點出發,按照某種順序訪問圖中的每個頂點,使每個頂點被訪問一次且僅一次。圖的遍歷與樹的遍歷操作功能相似。圖的遍歷是圖的一種基本操作,並且圖的許多其他操作都是建立在遍歷操作的基礎之上的。遍歷示意...