Java用鄰接表存儲圖的示例代碼
一、點睛
鄰接表是圖的一種鏈式存儲方法,其數(shù)據(jù)結構包括兩部分:節(jié)點和鄰接點。
用鄰接表可以表示無向圖,有向圖和網(wǎng)。在此用無向圖進行說明。
1.無向圖

2.無向圖的鏈接表

3.說明
節(jié)點 a 的鄰接點是節(jié)點 b、d,其鄰接點的存儲下標為1、3,按照頭插法(逆序)將其放入節(jié)點 a 后面的單鏈表中。
節(jié)點 b 的鄰接點是節(jié)點 a、c、d,其鄰接點的存儲下標為0、2、3,按照頭插法(逆序)將其放入節(jié)點 b 后面的單鏈表中。
節(jié)點 c 的鄰接點是節(jié)點 b、d,其鄰接點的存儲下標為1、3,按照頭插法(逆序)將其放入節(jié)點 c 后面的單鏈表中。
節(jié)點 d 的鄰接點是節(jié)點 a、b、c,其鄰接點的存儲下標為0、1、2,按照頭插法(逆序)將其放入節(jié)點 d 后面的單鏈表中。
4.無向圖
鄰接表的特點如下 如果無向圖中有 n 個節(jié)點、e 條邊,則節(jié)點表中有 n 個節(jié)點,鄰節(jié)點表有 2e 個節(jié)點。
節(jié)點的度為該節(jié)點后面單鏈表中的節(jié)點數(shù)。
二、鄰接表的數(shù)據(jù)結構
1.節(jié)點
包括節(jié)點信息 data 和指向第 1 個鄰接點的指針 first。

2.鄰接點
包括該鄰接點的存儲下標 v 和指向下一個鄰接點的指針 next,如果是網(wǎng)的鄰接點,則還需增加一個權值域 w,如下圖所示。

三、算法步驟
1 輸入節(jié)點數(shù)和邊數(shù)。
2 依次輸入節(jié)點信息,將其存儲到節(jié)點數(shù)組 Vex[] 的 data 域中,將 Vex[] first 域置空。
3 依次輸入每條邊依附的兩個節(jié)點,如果是網(wǎng),則還需要輸入該邊的權值。
如果是無向圖,則輸入 a b,查詢節(jié)點 a、b 在節(jié)點數(shù)組 Vex[] 中存儲下標 i、j,創(chuàng)建一個新的鄰接點 s,讓 s.v = j;s.next=null;然后將節(jié)點 s 插入第 i 個節(jié)點的第 1 個鄰接點之前(頭插法)。在無向圖中,從節(jié)點 a 到節(jié)點 b 有邊,從節(jié)點 b 到節(jié)點 a 也有邊,因此還需要創(chuàng)建一個新的鄰接點 s2,讓 s2.v = i;s2.next=null;然后讓 s2 節(jié)點插入第 j 個節(jié)點的第 1 個鄰接點之前(頭插法)。
如果是無向圖,則輸入 a b,查詢節(jié)點 a、b 在節(jié)點數(shù)組 Vex[] 中存儲下標 i、j,創(chuàng)建一個新的鄰接點 s,讓 s.v = j;s.next=null;然后將節(jié)點 s 插入第 i 個節(jié)點的第 1 個鄰接點之前(頭插法)。
如果是無向網(wǎng)或有向網(wǎng),則和無向圖或有向圖的處理方式一樣,只是鄰節(jié)點多了一個權值域。
四、實現(xiàn)
package graph;
import java.util.Scanner;
public class CreateALGraph {
static final int MaxVnum = 100; // 頂點數(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++) // 查找頂點信息的下標
if (x == G.Vex[i].data)
return i;
return -1; // 沒找到
}
// 插入一條邊
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("請輸入頂點數(shù)和邊數(shù):");
Scanner scanner = new Scanner(System.in);
G.vexnum = scanner.nextInt();
G.edgenum = scanner.nextInt();
System.out.println("請輸入頂點信息:");
for (i = 0; i < G.vexnum; i++)//輸入頂點信息,存入頂點信息數(shù)組
G.Vex[i].data = scanner.next().charAt(0);
for (i = 0; i < G.vexnum; i++)
G.Vex[i].first = null;
System.out.println("請依次輸入每條邊的兩個頂點u,v");
while (G.edgenum-- > 0) {
u = scanner.next().charAt(0);
v = scanner.next().charAt(0);
i = locatevex(G, u); // 查找頂點 u 的存儲下標
j = locatevex(G, v); // 查找頂點 v 的存儲下標
if (i != -1 && j != -1)
insertedge(G, i, j);
else {
System.out.println("輸入頂點信息錯!請重新輸入!");
G.edgenum++; // 本次輸入不算
}
}
}
}
// 定義鄰接點類型
class AdjNode {
int v; // 鄰接點下標
AdjNode next; // 指向下一個鄰接點
}
// 定義頂點類型
class VexNode {
char data; // VexType為頂點的數(shù)據(jù)類型,根據(jù)需要定義
AdjNode first; // 指向第一個鄰接點
}
// 定義鄰接表類型
class ALGraph {
VexNode Vex[] = new VexNode[CreateALGraph.MaxVnum];
int vexnum; // 頂點數(shù)
int edgenum; // 邊數(shù)
}五、測試
白色為輸出,綠色為輸入

以上就是Java用鄰接表存儲圖的示例代碼的詳細內(nèi)容,更多關于Java鄰接表存儲圖的資料請關注腳本之家其它相關文章!
相關文章
如何使用axis調(diào)用WebService及Java?WebService調(diào)用工具類
Axis是一個基于Java的Web服務框架,可以用來調(diào)用Web服務接口,下面這篇文章主要給大家介紹了關于如何使用axis調(diào)用WebService及Java?WebService調(diào)用工具類的相關資料,需要的朋友可以參考下2023-04-04
Spring Security permitAll()不允許匿名訪問的操作
這篇文章主要介紹了Spring Security permitAll()不允許匿名訪問的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
MyBatis-Plus 與Druid 數(shù)據(jù)源操作
SpringBoot框架集成MyBatis-Plus和Druid數(shù)據(jù)源,簡化了數(shù)據(jù)操作與監(jiān)控,MyBatis-Plus作為MyBatis的增強工具,自動實現(xiàn)CRUD操作,減少手寫SQL,提供分頁、邏輯刪除等功能,本文介紹MyBatis-Plus & Druid 數(shù)據(jù)源總結,感興趣的朋友一起看看吧2024-09-09
JAVA大作業(yè)之圖書管理系統(tǒng)實現(xiàn)全解
隨著網(wǎng)絡技術的高速發(fā)展,計算機應用的普及,利用計算機對圖書館的日常工作進行管理勢在必行,本篇文章手把手帶你用Java實現(xiàn)一個圖書管理系統(tǒng),大家可以在過程中查缺補漏,提升水平2022-01-01
java并發(fā)包工具CountDownLatch源碼分析
這篇文章主要為大家介紹了java并發(fā)包工具CountDownLatch源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10
使用IDEA如何打包發(fā)布SpringBoot并部署到云服務器
這篇文章主要介紹了使用IDEA如何打包發(fā)布SpringBoot并部署到云服務器問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12

