Java用鄰接表存儲(chǔ)圖的示例代碼
一、點(diǎn)睛
鄰接表是圖的一種鏈?zhǔn)酱鎯?chǔ)方法,其數(shù)據(jù)結(jié)構(gòu)包括兩部分:節(jié)點(diǎn)和鄰接點(diǎn)。
用鄰接表可以表示無(wú)向圖,有向圖和網(wǎng)。在此用無(wú)向圖進(jìn)行說(shuō)明。
1.無(wú)向圖
2.無(wú)向圖的鏈接表
3.說(shuō)明
節(jié)點(diǎn) a 的鄰接點(diǎn)是節(jié)點(diǎn) b、d,其鄰接點(diǎn)的存儲(chǔ)下標(biāo)為1、3,按照頭插法(逆序)將其放入節(jié)點(diǎn) a 后面的單鏈表中。
節(jié)點(diǎn) b 的鄰接點(diǎn)是節(jié)點(diǎn) a、c、d,其鄰接點(diǎn)的存儲(chǔ)下標(biāo)為0、2、3,按照頭插法(逆序)將其放入節(jié)點(diǎn) b 后面的單鏈表中。
節(jié)點(diǎn) c 的鄰接點(diǎn)是節(jié)點(diǎn) b、d,其鄰接點(diǎn)的存儲(chǔ)下標(biāo)為1、3,按照頭插法(逆序)將其放入節(jié)點(diǎn) c 后面的單鏈表中。
節(jié)點(diǎn) d 的鄰接點(diǎn)是節(jié)點(diǎn) a、b、c,其鄰接點(diǎn)的存儲(chǔ)下標(biāo)為0、1、2,按照頭插法(逆序)將其放入節(jié)點(diǎn) d 后面的單鏈表中。
4.無(wú)向圖
鄰接表的特點(diǎn)如下 如果無(wú)向圖中有 n 個(gè)節(jié)點(diǎn)、e 條邊,則節(jié)點(diǎn)表中有 n 個(gè)節(jié)點(diǎn),鄰節(jié)點(diǎn)表有 2e 個(gè)節(jié)點(diǎn)。
節(jié)點(diǎn)的度為該節(jié)點(diǎn)后面單鏈表中的節(jié)點(diǎn)數(shù)。
二、鄰接表的數(shù)據(jù)結(jié)構(gòu)
1.節(jié)點(diǎn)
包括節(jié)點(diǎn)信息 data 和指向第 1 個(gè)鄰接點(diǎn)的指針 first。
2.鄰接點(diǎn)
包括該鄰接點(diǎn)的存儲(chǔ)下標(biāo) v 和指向下一個(gè)鄰接點(diǎn)的指針 next,如果是網(wǎng)的鄰接點(diǎn),則還需增加一個(gè)權(quán)值域 w,如下圖所示。
三、算法步驟
1 輸入節(jié)點(diǎn)數(shù)和邊數(shù)。
2 依次輸入節(jié)點(diǎn)信息,將其存儲(chǔ)到節(jié)點(diǎn)數(shù)組 Vex[] 的 data 域中,將 Vex[] first 域置空。
3 依次輸入每條邊依附的兩個(gè)節(jié)點(diǎn),如果是網(wǎng),則還需要輸入該邊的權(quán)值。
如果是無(wú)向圖,則輸入 a b,查詢(xún)節(jié)點(diǎn) a、b 在節(jié)點(diǎn)數(shù)組 Vex[] 中存儲(chǔ)下標(biāo) i、j,創(chuàng)建一個(gè)新的鄰接點(diǎn) s,讓 s.v = j;s.next=null;然后將節(jié)點(diǎn) s 插入第 i 個(gè)節(jié)點(diǎn)的第 1 個(gè)鄰接點(diǎn)之前(頭插法)。在無(wú)向圖中,從節(jié)點(diǎn) a 到節(jié)點(diǎn) b 有邊,從節(jié)點(diǎn) b 到節(jié)點(diǎn) a 也有邊,因此還需要?jiǎng)?chuàng)建一個(gè)新的鄰接點(diǎn) s2,讓 s2.v = i;s2.next=null;然后讓 s2 節(jié)點(diǎn)插入第 j 個(gè)節(jié)點(diǎn)的第 1 個(gè)鄰接點(diǎn)之前(頭插法)。
如果是無(wú)向圖,則輸入 a b,查詢(xún)節(jié)點(diǎn) a、b 在節(jié)點(diǎn)數(shù)組 Vex[] 中存儲(chǔ)下標(biāo) i、j,創(chuàng)建一個(gè)新的鄰接點(diǎn) s,讓 s.v = j;s.next=null;然后將節(jié)點(diǎn) s 插入第 i 個(gè)節(jié)點(diǎn)的第 1 個(gè)鄰接點(diǎn)之前(頭插法)。
如果是無(wú)向網(wǎng)或有向網(wǎng),則和無(wú)向圖或有向圖的處理方式一樣,只是鄰節(jié)點(diǎn)多了一個(gè)權(quán)值域。
四、實(shí)現(xiàn)
package graph; import java.util.Scanner; public class CreateALGraph { static final int MaxVnum = 100; // 頂點(diǎn)數(shù)最大值 public static void main(String[] args) { ALGraph G = new ALGraph(); for (int i = 0; i < G.Vex.length; i++) { G.Vex[i] = new VexNode(); } CreateALGraph(G); // 創(chuàng)建有向圖鄰接表 printg(G); // 輸出鄰接表 } static int locatevex(ALGraph G, char x) { for (int i = 0; i < G.vexnum; i++) // 查找頂點(diǎn)信息的下標(biāo) if (x == G.Vex[i].data) return i; return -1; // 沒(méi)找到 } // 插入一條邊 static void insertedge(ALGraph G, int i, int j) { AdjNode s = new AdjNode(); s.v = j; s.next = G.Vex[i].first; G.Vex[i].first = s; } // 輸出鄰接表 static void printg(ALGraph G) { System.out.println("----------鄰接表如下:----------"); for (int i = 0; i < G.vexnum; i++) { AdjNode t = G.Vex[i].first; System.out.print(G.Vex[i].data + ": "); while (t != null) { System.out.print("[" + t.v + "]\t"); t = t.next; } System.out.println(); } } // 創(chuàng)建有向圖鄰接表 static void CreateALGraph(ALGraph G) { int i, j; char u, v; System.out.println("請(qǐng)輸入頂點(diǎn)數(shù)和邊數(shù):"); Scanner scanner = new Scanner(System.in); G.vexnum = scanner.nextInt(); G.edgenum = scanner.nextInt(); System.out.println("請(qǐng)輸入頂點(diǎn)信息:"); for (i = 0; i < G.vexnum; i++)//輸入頂點(diǎn)信息,存入頂點(diǎn)信息數(shù)組 G.Vex[i].data = scanner.next().charAt(0); for (i = 0; i < G.vexnum; i++) G.Vex[i].first = null; System.out.println("請(qǐng)依次輸入每條邊的兩個(gè)頂點(diǎn)u,v"); while (G.edgenum-- > 0) { u = scanner.next().charAt(0); v = scanner.next().charAt(0); i = locatevex(G, u); // 查找頂點(diǎn) u 的存儲(chǔ)下標(biāo) j = locatevex(G, v); // 查找頂點(diǎn) v 的存儲(chǔ)下標(biāo) if (i != -1 && j != -1) insertedge(G, i, j); else { System.out.println("輸入頂點(diǎn)信息錯(cuò)!請(qǐng)重新輸入!"); G.edgenum++; // 本次輸入不算 } } } } // 定義鄰接點(diǎn)類(lèi)型 class AdjNode { int v; // 鄰接點(diǎn)下標(biāo) AdjNode next; // 指向下一個(gè)鄰接點(diǎn) } // 定義頂點(diǎn)類(lèi)型 class VexNode { char data; // VexType為頂點(diǎn)的數(shù)據(jù)類(lèi)型,根據(jù)需要定義 AdjNode first; // 指向第一個(gè)鄰接點(diǎn) } // 定義鄰接表類(lèi)型 class ALGraph { VexNode Vex[] = new VexNode[CreateALGraph.MaxVnum]; int vexnum; // 頂點(diǎn)數(shù) int edgenum; // 邊數(shù) }
五、測(cè)試
白色為輸出,綠色為輸入
以上就是Java用鄰接表存儲(chǔ)圖的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Java鄰接表存儲(chǔ)圖的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java正則表達(dá)式獲取指定HTML標(biāo)簽的指定屬性值且替換的方法
下面小編就為大家?guī)?lái)一篇java正則表達(dá)式獲取指定HTML標(biāo)簽的指定屬性值且替換的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12分布式醫(yī)療掛號(hào)系統(tǒng)EasyExcel導(dǎo)入導(dǎo)出數(shù)據(jù)字典的使用
這篇文章主要為大家介紹了分布式醫(yī)療掛號(hào)系統(tǒng)EasyExcel導(dǎo)入導(dǎo)出數(shù)據(jù)字典的使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04Eclipse項(xiàng)目有紅感嘆號(hào)的解決方法
這篇文章主要為大家詳細(xì)介紹了Eclipse項(xiàng)目有紅感嘆號(hào)的解決方法,給出了Eclipse項(xiàng)目有紅感嘆號(hào)的原因,以及如何解決?,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04@RequestParam 接收參數(shù)的值為null的處理方式
這篇文章主要介紹了@RequestParam 接收參數(shù)的值為null的處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11SpringBoot配置@Configuration注解和@bean注解
這篇文章主要介紹了SpringBoot配置@Configuration注解和@bean注解,文章圍繞主題相關(guān)內(nèi)容展開(kāi)詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-04-04基于Mybatis-Plus的CRUD的實(shí)現(xiàn)
這篇文章主要介紹了基于Mybatis-Plus的CRUD的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11