1. 程式人生 > >資料結構 圖的鄰接表

資料結構 圖的鄰接表

呃,下面該寫鄰接表了.......

最近感覺資料結構比以前難了,難道是我想寫網頁的原因麼,哈哈

鄰接表的出現是因為圖若是稀疏圖,用鄰接矩陣會造成空間的浪費,畢竟你要開闢一個一維陣列和一個二維陣列嘛,而且還是大開小用的那種。

鄰接表為了避免記憶體的浪費引入了鏈式儲存,它的處理辦法是:

1.用一個一維陣列儲存頂點,當然你也可以用單鏈表儲存,

2.用單鏈表儲存頂點的鄰接點,可以將頂點改為結構體陣列,結構體中存放鄰接點的指標,鄰接點也建立一個結構體,定義指標next存放該頂點的另一個鄰接點,這樣就可以把該頂點的所有鄰接點串起來了。

下面是一個無向的網圖:

鄰接表中資料的儲存圖示如下(emmm,無向圖果然沒有有向圖好畫):

emmm,終於畫完了,我來介紹下這個圖

頂點表也就是個結構體陣列,是存放頂點的結構,頂點表中有data元素,存放頂點資訊  firstarc是一個邊結構體表指標,存放鄰接點的資訊。

邊表也是一個結構體,內有adivex元素,存放鄰接點的下標,weight存放頂點與鄰接點之間線的權重,next是邊表結構體指標,存放該頂點的下一個鄰接點,next就是負責將頂點的鄰接點連起來。

看著上面的圖慢慢理解吧!

下面則是程式碼部分:

#include <iostream>
using namespace std;

#define MAXVERTEX 100   //最大頂點數
typedef char vertextype;    //定義頂點的儲存型別
typedef int arctype;    //定義邊的權值型別

typedef struct ArcNode  //邊表節點
{
    int adjvex; //鄰接點域,儲存該頂點對應的下標
    arctype wigth;  //用於儲存權值
    struct ArcNode *next; //鏈域,指向下一個鄰接點
}ArcNode;

typedef struct VertexNode   //頂點表節點
{
    vertextype data;    //儲存頂點資料的資訊
    ArcNode *firstarc;  //邊表頭指標
}VertexNode, AdjList[MAXVERTEX];

typedef struct
{
    AdjList adjlist;    //定義鄰接表
    int numvertex;  //當前鄰接表的頂點數
    int numarc; //當前鄰接表的邊數
}GraphAdjList;

//建立圖的鄰接表
void CreateAdjListGraph(GraphAdjList &G)
{
    ArcNode *e;
    cin >> G.numvertex; //輸入當前圖的頂點數
    cin >> G.numarc;    //輸入當前圖的邊數
    for(int i = 0; i < G.numvertex; i++)    //建立頂點表
    {
        cin >> G.adjlist[i].data;   //輸入頂點資訊
        G.adjlist[i].firstarc = NULL;   //將表邊指標置為空
    }
    for(int k = 0; k < G.numarc; k++)
    {
        int i, j, w;
        cin >> i >> j >> w; //輸入邊兩邊的頂點和邊上的權重
        e = new ArcNode;   //建立一個表邊節點指標
        e->adjvex = j;
        e->wigth = w;
        e->next = G.adjlist[i].firstarc;
        G.adjlist[i].firstarc = e;
        //因為是無向圖,彼此相對稱
        e = new ArcNode;   //建立一個表邊節點指標
        e->adjvex = i;
        e->wigth = w;
        e->next = G.adjlist[j].firstarc;
        G.adjlist[j].firstarc = e;
    }
}

//列印鄰接表
void PrintfGraphAdjList(GraphAdjList G)
{
    for(int i = 0; i < G.numvertex; i++)
    {
        ArcNode *p = G.adjlist[i].firstarc;
        cout << G.adjlist[i].data << '\t';
        while(p)
        {
            cout << p->adjvex << ' ' << p->wigth << '\t';
            p = p->next;
        }
        cout << endl;
    }
}
int main()
{
    GraphAdjList G;
    CreateAdjListGraph(G);
    PrintfGraphAdjList(G);
    return 0;
}

鄰接表的時間複雜度:n為頂點數,e為邊數 O(n + e)……

執行結果(根據上圖的資訊輸入):


相關推薦

資料結構--鄰接

使用鄰接矩陣有它的優點:易於求結點度,求鄰接點,易判斷兩點間是否有弧相連。但不利於稀疏圖的儲存,因弧不存在時也要儲存相應資訊。且要預分配足夠大空間。 下面來介紹使用鄰接表的方式來儲存圖。 在鄰接表中,對圖中每個頂點建立一個單鏈表,第i個單鏈表中的結點表示依附與頂點vi的邊

資料結構鄰接的儲存結構 建立鄰接演算法

【資料結構】鄰接矩陣及其實現 一個圖的鄰接矩陣的表示是唯一的,但其鄰接表表示不唯一,這是因為在鄰接表結構中,各便表結點的連結次序取決於建立鄰接表時的演算法以及輸入的次序。 一般而言鄰接矩陣適合儲存稠密圖,鄰接表適合儲存稀疏圖。 直接輸入:  #include <s

資料結構-基於鄰接實現的遍歷視覺化及使用Floyd、Dijkstra演算法求解最短路徑(JavaScript實現)

使用 JavaScript 基於鄰接表實現了圖的深度、廣度遍歷,以及 Floyd、Dijkstra 演算法求解最短路徑。另外使用 SVG 實現圖的遍歷視覺化。<!DOCTYPE html> <html lang="en"> <head>

資料結構--鄰接矩陣

圖是一種較線性表和樹更為複雜的資料結構。線上性表中,資料元素之間只有線性關係,每個資料元素只有一個直接前驅和一個直接後繼。在樹形結構中,資料元素之間有著明顯的層次關係,並且每一層上的資料元素可能與下一層中多個元素相關,但只能與上一層中一個元素相關。而在圖形結構中,結點之間的關

資料結構——PTA 鄰接矩陣儲存的深度優先遍歷、鄰接儲存的廣度優先遍歷

廣度優先與深度優先是遍歷圖的兩種基本方法,大致的思想是DFS為遞迴,而BFS是佇列。 這裡給出PTA兩道題目的答案,方法很基本,但第三個形參還是第一次見,去網上搜了搜給出的說法是呼叫函式的地址,但個人感覺就是呼叫這個函式。。。 下面給出兩段程式碼 void BFS ( LGraph

資料結構與演算法——有向鄰接輸出其拓撲排序序列

  測試資料 輸入: 12 16 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c1 c4 c1 c2 c1 c3 c1 c12 c4 c5 c2 c3 c3 c5 c3 c7 c5 c7 c3 c8 c9 c12 c9 c10 c10 c12 c

C++資料結構 22 -鄰接

#include <iostream> #include <list> using namespace std; class Vertex { }; template<class T> class Graph { public: Gra

資料結構——整理程式碼(鄰接儲存

資料結構圖相關程式碼整理記錄——鄰接表儲存圖 環境CodeBlocks17 執行通過 #include <iostream> #include <stdio.h> #include <stdlib.h> #include <queue> usi

資料結構 鄰接儲存結構及DFS/BFS遍歷

//鄰接表 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #define INF 999 using namespace std; typedef

資料結構鄰接矩陣鄰接

鄰接矩陣 所謂鄰接矩陣(Adjacency Matrix)的儲存結構,就是用一維陣列儲存圖中頂點的資訊,用矩陣表示圖中各頂點之間的鄰接關係。假設圖G=(V,E)有n 個確定的頂點,即V={v0,v1,…,vn-1},則表示G 中各頂點相鄰關係為一個n×n 的矩陣,矩陣的元素

資料結構 鄰接表示轉換成鄰接矩陣表示的演算法

圖的鄰接表表示轉換成鄰接矩陣表示的演算法。 下面這個是有向圖鄰接表表示轉換成鄰接矩陣 #include <stdio.h> #include <string.h> #include <stdlib.h> int a[100][100];

資料結構---鄰接(建立、列印、深度優先遍歷,廣度優先遍歷C語言)

當一個圖為稀疏圖時,使用鄰接矩陣會浪費大量儲存空間。 鄰接表法結合了順序儲存和鏈式儲存方法,減少了不必要的浪費。 鄰接表 1)對圖G的每個頂點vi建立一個單鏈表,第i個單鏈表中的結點表示依附於頂點vi的邊(對於有向圖則是以頂點vi為尾的弧)。這個單鏈表就稱為頂點vi

資料結構———概念和儲存(鄰接矩陣,鄰接

圖的概念 為什麼要有圖 在學習圖之前我們應該學習了,線性表和樹;但是我們有沒有考慮過為什麼要有圖,線性表和圖的侷限性優勢上面呢? 線性表他僅僅侷限於一個直接前驅和一個直接後繼的關係。 樹呢?樹也僅僅只能有一個直接前驅也就是父節點。 那麼這種多對

資料結構 鄰接

呃,下面該寫鄰接表了.......最近感覺資料結構比以前難了,難道是我想寫網頁的原因麼,哈哈鄰接表的出現是因為圖若是稀疏圖,用鄰接矩陣會造成空間的浪費,畢竟你要開闢一個一維陣列和一個二維陣列嘛,而且還是大開小用的那種。鄰接表為了避免記憶體的浪費引入了鏈式儲存,它的處理辦法是:

資料結構---鄰接

// Graph_Adjacency List.cpp : Defines the entry point for the console application. /*-----CODE FOR FUN--------------- -------CREATED BY D

演算法與資料結構基礎8:C++實現有向——鄰接儲存

前面實現了連結串列和樹,現在看看圖。 連結串列是一對一的對應關係; 樹是一對多的對應關係; 圖是多對多的對應關係。 圖一般有兩種儲存方式,鄰接表和鄰接矩陣。 先看鄰接表。 鄰接表就是將圖中所有的點用一個數組儲存起來,並將此作為一個連結串列的頭, 連結串列中儲存跟這個點相鄰的

- 存儲結構鄰接

分享 循環 AI nowrap reat gin 序號 方式 ola 對於圖來說,鄰接矩陣是不錯的一種圖存儲結構,但是我們也發現,對於邊數相對頂點較少的圖,這種結構是存在對存儲空間的極大浪費的。因此我們考慮另外一種存儲結構方式:鄰接表(Adjacency List),即數組

資料結構--C語言-鄰接矩陣-的遍歷

資料結構-圖-C語言-鄰接矩陣-圖的遍歷 bool visited[999]; void visit(Vertex V) { printf("正在訪問頂點%d\n", V); } bool isEdge(MGraph graph, Vertex v, Vertex w) { re

資料結構——的遍歷(以鄰接矩陣為例)

  #include<stdio.h> #define N 20 #define TRUE 1 #define FALSE 0 int visited[N]; typedef struct /*佇列的定義*/ { int data[N]; i

的儲存結構--多重鄰接鄰接多重

和十字連結串列類似。 區別在於陣列存的連結串列的元素的結構不同。 十字連結串列陣列元素的結構是:資料、第一條入邊引用、第一條出邊引用。 十字連結串列連結串列的元素結構是:邊的起點、邊的終點、下一條出邊引用、下一條入邊引用 而 多重鄰接表陣列元素結構是:資料、包含 當前索引對應頂點