最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java用鄰接表存儲(chǔ)圖的示例代碼

 更新時(shí)間:2022年06月20日 15:58:11   作者:chengqiuming  
鄰接表是圖的一種鏈?zhǔn)酱鎯?chǔ)方法,其數(shù)據(jù)結(jié)構(gòu)包括兩部分:節(jié)點(diǎn)和鄰接點(diǎn)。本文將用鄰接表實(shí)現(xiàn)存儲(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,查詢節(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,查詢節(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; // 沒找到
    }
 
    // 插入一條邊
    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)類型
class AdjNode {
    int v; // 鄰接點(diǎn)下標(biāo)
    AdjNode next; // 指向下一個(gè)鄰接點(diǎn)
}
 
// 定義頂點(diǎn)類型
class VexNode {
    char data; // VexType為頂點(diǎn)的數(shù)據(jù)類型,根據(jù)需要定義
    AdjNode first; // 指向第一個(gè)鄰接點(diǎn)
}
 
// 定義鄰接表類型
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)文章

  • 如何使用axis調(diào)用WebService及Java?WebService調(diào)用工具類

    如何使用axis調(diào)用WebService及Java?WebService調(diào)用工具類

    Axis是一個(gè)基于Java的Web服務(wù)框架,可以用來(lái)調(diào)用Web服務(wù)接口,下面這篇文章主要給大家介紹了關(guān)于如何使用axis調(diào)用WebService及Java?WebService調(diào)用工具類的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • 深入jetty的使用詳解

    深入jetty的使用詳解

    本篇文章是對(duì)jetty的使用進(jìn)行了詳細(xì)的分析解釋。需要的朋友參考下
    2013-05-05
  • Spring Security permitAll()不允許匿名訪問的操作

    Spring Security permitAll()不允許匿名訪問的操作

    這篇文章主要介紹了Spring Security permitAll()不允許匿名訪問的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • MyBatis-Plus 與Druid 數(shù)據(jù)源操作

    MyBatis-Plus 與Druid 數(shù)據(jù)源操作

    SpringBoot框架集成MyBatis-Plus和Druid數(shù)據(jù)源,簡(jiǎn)化了數(shù)據(jù)操作與監(jiān)控,MyBatis-Plus作為MyBatis的增強(qiáng)工具,自動(dòng)實(shí)現(xiàn)CRUD操作,減少手寫SQL,提供分頁(yè)、邏輯刪除等功能,本文介紹MyBatis-Plus & Druid 數(shù)據(jù)源總結(jié),感興趣的朋友一起看看吧
    2024-09-09
  • JAVA大作業(yè)之圖書管理系統(tǒng)實(shí)現(xiàn)全解

    JAVA大作業(yè)之圖書管理系統(tǒng)實(shí)現(xiàn)全解

    隨著網(wǎng)絡(luò)技術(shù)的高速發(fā)展,計(jì)算機(jī)應(yīng)用的普及,利用計(jì)算機(jī)對(duì)圖書館的日常工作進(jìn)行管理勢(shì)在必行,本篇文章手把手帶你用Java實(shí)現(xiàn)一個(gè)圖書管理系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平
    2022-01-01
  • java并發(fā)包工具CountDownLatch源碼分析

    java并發(fā)包工具CountDownLatch源碼分析

    這篇文章主要為大家介紹了java并發(fā)包工具CountDownLatch源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Java實(shí)戰(zhàn)之敏感詞過(guò)濾器

    Java實(shí)戰(zhàn)之敏感詞過(guò)濾器

    這篇文章主要介紹了Java實(shí)戰(zhàn)之敏感詞過(guò)濾器,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • 使用IDEA如何打包發(fā)布SpringBoot并部署到云服務(wù)器

    使用IDEA如何打包發(fā)布SpringBoot并部署到云服務(wù)器

    這篇文章主要介紹了使用IDEA如何打包發(fā)布SpringBoot并部署到云服務(wù)器問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Spring Data Neo4j Cypher查詢使用

    Spring Data Neo4j Cypher查詢使用

    本文介紹了Spring Data Neo4j Cypher查詢使用的幾種方法,包括使用Repository接口、動(dòng)態(tài)查詢、服務(wù)層組合、外部查詢文件和圖形化查詢構(gòu)建器, 感興趣的可以了解一下
    2024-11-11
  • Java技巧:快速獲取圖片拍攝時(shí)間

    Java技巧:快速獲取圖片拍攝時(shí)間

    想知道如何用Java讀取圖片的拍攝時(shí)間嗎?在這篇指南中,我將向你展示如何利用Java編程語(yǔ)言輕松獲取圖像的拍攝時(shí)間信息,不要錯(cuò)過(guò)這個(gè)簡(jiǎn)單而有用的技巧!
    2023-12-12

最新評(píng)論

温州市| 英德市| 苍南县| 宣化县| 德庆县| 武川县| 连城县| 鄂尔多斯市| 武鸣县| 平乡县| 麻城市| 资阳市| 务川| 涡阳县| 会昌县| 黄浦区| 平乡县| 墨竹工卡县| 彭水| 安国市| 中卫市| 和静县| 乌苏市| 平乡县| 绵阳市| 林芝县| 大邑县| 荣成市| 安徽省| 阿克陶县| 康保县| 南丹县| 桑植县| 灵宝市| 新余市| 精河县| 类乌齐县| 邹城市| 张掖市| 湘阴县| 建德市|