0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

存儲結構方式之鄰接表詳解

Linux內核補給站 ? 來源:Linux內核補給站 ? 作者:Linux內核補給站 ? 2022-05-11 14:36 ? 次閱讀

對于圖來說,鄰接矩陣是不錯的一種圖存儲結構,但是我們也發(fā)現,對于邊數相對頂點較少的圖,這種結構是存在對存儲空間的極大浪費的。因此我們考慮另外一種存儲結構方式:鄰接表(Adjacency List),即數組與鏈表相結合的存儲方法。

鄰接表的處理方法是這樣的。

1、圖中頂點用一個一維數組存儲,另外,對于頂點數組中,每個數據元素還需要存儲指向第一個鄰接點的指針,以便于查找該頂點的邊信息。

2、圖中每個頂點vi的所有鄰接點構成一個線性表,由于鄰接點的個數不定,所以用單鏈表存儲,無向圖稱為頂點vi的邊表,有向圖稱為頂點vi作為弧尾的出邊表。

例如圖7-4-6就是一個無向圖的鄰接表結構。

pYYBAGJ7WWGAVUOqAABSRf5QXO0094.jpg?source=d16d100b

?

若是有向圖,鄰接表的結構是類似的,如圖7-4-7,以頂點作為弧尾來存儲邊表容易得到每個頂點的出度,而以頂點為弧頭的表容易得到頂點的入度,即逆鄰接表。

poYBAGJ7WWGAGZQgAACGMHgu348874.jpg?source=d16d100b

?

對于帶權值的網圖,可以在邊表結點定義中再增加一個weight的數據域,存儲權值信息即可,如圖7-4-8所示。

pYYBAGJ7WWKAMFRqAABejlD9Eko070.jpg?source=d16d100b

?

下面示例無向圖的鄰接表創(chuàng)建:(改編自《大話數據結構》)

C++ Code 

#include
using  namespace std;

#define MAXVEX  100  /* 最大頂點數,應由用戶定義 */
typedef  char VertexType;  /* 頂點類型應由用戶定義 */
typedef  int EdgeType;  /* 邊上的權值類型應由用戶定義 */

typedef  struct EdgeNode /* 邊表結點  */
{
     int adjvex; /* 鄰接點域,存儲該頂點對應的下標 */
    EdgeType weight; /* 用于存儲權值,對于非網圖可以不需要 */
     struct EdgeNode *next;  /* 鏈域,指向下一個鄰接點 */
} EdgeNode;

typedef  struct VextexNode /* 頂點表結點 */
{
    VertexType data; /* 頂點域,存儲頂點信息 */
    EdgeNode *firstedge; /* 邊表頭指針 */
} VextexNode, AdjList[MAXVEX];

typedef  struct
{
    AdjList adjList;
     int numNodes, numEdges;  /* 圖中當前頂點數和邊數 */
} GraphAdjList;


void CreateALGraph(GraphAdjList *Gp)
{
     int i, j, k;
    EdgeNode *pe;
    cout <<  "輸入頂點數和邊數(空格分隔):" << endl;
    cin >> Gp->numNodes >> Gp->numEdges;

     for (i =  0 ; i < Gp->numNodes; i++)
    {
        cout <<  "輸入頂點信息:" << endl;
        cin >> Gp->adjList[i].data;
        Gp->adjList[i].firstedge =  NULL; /* 將邊表置為空表 */
    }

     for (k =  0; k <  Gp->numEdges; k++) /* 建立邊表 */
    {
        cout <<  "輸入邊(vi,vj)的頂點序號i,j(空格分隔):" << endl;
        cin >> i >> j;
        pe = (EdgeNode *)malloc( sizeof(EdgeNode));
        pe->adjvex = j; /* 鄰接序號為j */
         /* 將pe的指針指向當前頂點上指向的結點 */
        pe->next = Gp->adjList[i].firstedge;
        Gp->adjList[i].firstedge = pe; /* 將當前頂點的指針指向pe */

        pe = (EdgeNode *)malloc( sizeof(EdgeNode));
        pe->adjvex = i;
        pe->next = Gp->adjList[j].firstedge;
        Gp->adjList[j].firstedge = pe;

    }
}

int main( void)
{
    GraphAdjList GL;
    CreateALGraph(&GL);

     return  0;
}

這里的鄰接點插入使用了單鏈表創(chuàng)建中的頭插法,對于無向圖來說,一條邊對應都是兩個頂點,所以在循環(huán)中,一次就針對i和j分別進行了插入。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 矩陣
    +關注

    關注

    0

    文章

    417

    瀏覽量

    34413
  • 存儲結構
    +關注

    關注

    0

    文章

    21

    瀏覽量

    9691
收藏 人收藏

    評論

    相關推薦

    RealView MDK中結構存儲方式

    ;int four;} c; 二 三種定義結構方式對應用匯編代碼非壓縮方式存儲(對齊方式
    發(fā)表于 08-02 10:17

    注冊結構詳解

    注冊結構詳解
    發(fā)表于 03-05 15:06

    Docker數據存儲方式Volumes詳解

    Docker數據存儲Volumes
    發(fā)表于 03-26 11:27

    網絡存儲技術詳解

    網絡存儲技術詳解 網絡存儲技術一般分為三種,分別是NAS、SAN、DAS: NAS網絡存儲
    發(fā)表于 01-13 11:29 ?1151次閱讀

    邏輯漏洞越權詳解

    邏輯漏洞越權詳解
    發(fā)表于 09-07 09:41 ?5次下載
    邏輯漏洞<b class='flag-5'>之</b>越權<b class='flag-5'>詳解</b>

    基于MSP430功能模塊詳解系列——FLASH存儲

    基于MSP430功能模塊詳解系列——FLASH存儲
    發(fā)表于 10-12 15:27 ?11次下載
    基于MSP430功能模塊<b class='flag-5'>詳解</b>系列<b class='flag-5'>之</b>——FLASH<b class='flag-5'>存儲</b>器

    基于平面閉鏈機構的縮桿鄰接矩陣變更

    針對平面閉鏈機構運動特性集成的問題,對閉鏈機構的設計過程、閉鏈機構運動鏈數目綜合過程、縮桿鄰接矩陣表示、去同構鏈、去呆鏈等方面進行了研究,以此獲得了各桿件不同自由度的縮桿鄰接矩陣數目。通過對各縮桿
    發(fā)表于 03-20 11:31 ?0次下載
    基于平面閉鏈機構的縮桿<b class='flag-5'>鄰接</b>矩陣變更

    線性的鏈式存儲結構知識講解

    線性的鏈式存儲結構知識講解
    發(fā)表于 05-09 11:01 ?11次下載

    數據存儲方式有哪些

    順序存儲方法: 該方法把邏輯上相鄰的結點存儲在物理位置上相鄰的存儲單元里,結點間的邏輯關系由存儲單元的鄰接關系來體現。
    發(fā)表于 10-27 12:31 ?4.5w次閱讀
    數據<b class='flag-5'>存儲</b><b class='flag-5'>方式</b>有哪些

    一文詳解存儲結構

    存儲結構與之前所學的線性存儲結構有所差異,這緣于棧對數據 “存” 和 “取” 的過程有特殊的要求。
    發(fā)表于 10-09 16:00 ?2351次閱讀
    一文<b class='flag-5'>詳解</b>棧<b class='flag-5'>存儲</b>的<b class='flag-5'>結構</b>

    如何使用鄰接樹的數據結構提高遺傳算法的挖掘效率

    為提高復雜網絡中遺傳算法的子圖挖掘效率,在鄰接的鏈式結構基礎上加入雙樹狀結構,作為一種新型數據結構———
    發(fā)表于 10-23 11:47 ?19次下載
    如何使用<b class='flag-5'>鄰接</b>樹的數據<b class='flag-5'>結構</b>提高遺傳算法的挖掘效率

    一文詳解存儲結構的模型

    存儲的快速發(fā)展過程中,不同的廠商對云存儲提供了不同的結構模型,在這里,我們介紹一個比較有代表性的云存儲結構模型。
    發(fā)表于 12-25 11:23 ?3919次閱讀
    一文<b class='flag-5'>詳解</b>云<b class='flag-5'>存儲</b><b class='flag-5'>結構</b>的模型

    BLE實驗詳解藍牙血壓計設計方案

    BLE實驗詳解藍牙血壓計設計方案
    發(fā)表于 03-30 16:46 ?37次下載
    BLE實驗<b class='flag-5'>詳解</b><b class='flag-5'>之</b>藍牙血壓計設計方案

    全面解讀MOSFET結構及設計詳解

    MOSFET結構、特性參數及設計詳解
    發(fā)表于 01-26 16:47 ?1119次閱讀

    態(tài)勢數據存儲方式有哪些

    數據庫通過定義數據、字段、數據類型以及之間的關系,確保數據的完整性、一致性和安全性。這種存儲方式在需要頻繁查詢和更新數據的情況下表現良好。 非關系型數據庫
    的頭像 發(fā)表于 04-22 19:28 ?219次閱讀