用鄰接表表示圖
鄰接表:圖的常用儲存結構之一,由表頭結點和表結點兩部分組成,其中表頭結點儲存圖的各頂點,表結點用單向連結串列儲存表頭結點所對應頂點的相鄰頂點(也就是表示了圖的邊)。在有向圖裡表示表頭結點指向其它結點(a->b),無向圖則表示與表頭結點相鄰的所有結點(a—b)
以一個無向圖為例
結構定義:
//表頭結點(表示圖的頂點) struct vnode{ char data; //頂點資料,這裡用字元表示 struct arcnode * firstarc; //指標指向第一條邊 }; //表結點(表示圖的邊) struct arcnode{ int wt; //權重 int adjvex; //頂點下標 struct arcnode *nextarc; //指標指向下一條邊 }; typedef struct arcnode * Arc; //圖 struct mgraph{ struct vnode vexs[100]; int vexsnum,arcnum; //頂點數,邊數 } *g; typedef struct mgraph* Graph;
建圖並輸出圖
int findadj(char vexs,Graph g){ int i; for(i=1;i<=g->vexsnum;i++){ if(vexs==g->vexs[i].data) break; } return i; } //建圖 Graph creategraph(){ Graph g1; char vex; g1=(Graph)malloc(sizeof(struct mgraph)); g1->arcnum=0; g1->vexsnum=0; printf("輸入頂點,輸入-代表結束\n"); scanf("%c",&vex); //輸入頂點 while(vex!='-'){ //輸入-後迴圈結束 g1->vexsnum++; g1->vexs[g1->vexsnum].data=vex; //這裡的結構陣列vexs[]下標從1開始 g1->vexs[g1->vexsnum].firstarc=NULL; printf("輸入下一個頂點,輸入-代表結束\n"); scanf(" %c",&vex); //%c前面加空格防止讀取回車 } int i; int w; //邊的權重 int adjvex; //頂點的下標 char avex; //邊的另一個頂點 Arc p,b; for(i=1;i<=g1->vexsnum;i++){ printf("輸入%c的相鄰頂點,輸入-代表結束",g1->vexs[i].data); scanf(" %c",&avex); while(avex!='-'){ //輸入-後迴圈結束 adjvex=findadj(avex,g1); printf("輸入邊%c%c的權重\n",g1->vexs[i].data,avex); scanf("%d",&w); b=(Arc)malloc(sizeof(struct arcnode)); b->adjvex=adjvex; b->wt=w; b->nextarc=NULL; //連結串列追加結點 p=g1->vexs[i].firstarc; if(p!=NULL){ while(p->nextarc!=NULL) p=p->nextarc; p->nextarc=b; }else g1->vexs[i].firstarc=b; g1->arcnum++; printf("輸入%c的相鄰頂點,輸入-代表結束",g1->vexs[i].data); scanf(" %c",&avex); } } return g1; } //圖的輸出 void printgraph(Graph g){ int i,k; Arc p; printf("———鄰接表————\n"); for(i=1;i<=g->vexsnum;i++){ printf("%c ->",g->vexs[i].data); p=g->vexs[i].firstarc; while(p!=NULL){ printf("%4c",g->vexs[i].data); k=p->adjvex; printf("%2c",g->vexs[k].data); printf("%2d",p->wt); if(p->nextarc!=NULL) printf(" ->"); p=p->nextarc; } printf("\n"); } printf("\n"); printf("—————————\n"); printf("頂點總數為%4d\n",g->vexsnum); printf("邊的總數為%4d\n",g->arcnum); } void main(){ g=creategraph(); printgraph(g); }
控制檯輸出
相關推薦
用鄰接表表示圖
鄰接表:圖的常用儲存結構之一,由表頭結點和表結點兩部分組成,其中表頭結點儲存圖的各頂點,表結點用單向連結串列儲存表頭結點所對應頂點的相鄰頂點(也就是表示了圖的邊)。在有向圖裡表示表頭結點指向其它結點(a->b),無向圖則表示與表頭結點相鄰的所有結點(a—b) 以一個無
鄰接表表示圖
還要 day size tro OS 信息 def sizeof 指針 對於鄰接表,G[N]為指針數組,對應矩陣每行一個鏈表,只存非0元素 指針數組裏的每一個指針都是一個單鏈表的頭指針,單鏈表裏每個節點裏存儲的是圖中每條邊的信息。 鄰接表包括一個頂點表和一個邊表。頂點表包
鄰接表表示圖(有向、無向圖)及廣度、深度遍歷)
鄰接表表示圖 #include <iostream> #include <malloc.h> #include <queue> using namespace std; #define VertexType char #define MaxVerte
鄰接矩陣,鄰接表表示圖,深度優先遍歷
#include <stdio.h> #include <stdlib.h> bool visited[vernum]; int main() { printf("Hello world!\n"); return 0; } void
12.boost有向無向圖鄰接表表示
blog 所有結點 ace 都是 col vector fin std pan 1 #include <iostream> 2 #include <boost/config.hpp> 3 //圖(矩陣實現) 4 #include <b
用鄰接表實現無向圖的建立與輸出
1 #include<stdio.h> 2 #include <iostream> 3 #include<algorithm> 4 using namespace std; 5 #define MVNum 100 6 typedef struct ArcN
第十二週專案2 - 操作用鄰接表儲存的圖
/*Copyright (c) 2015, 煙臺大學計算機與控制工程學院 * All rights reserved. * 檔名稱:H1.cpp * 作者:辛志勐 * 完成日期:2015年11月20日 * 版本號:VC6.0 * 問題描述:操作用鄰接表儲存的圖 * 輸入描述:無 * 程式輸出:(1)
圖(鄰接矩陣與鄰接表表示法)
圖的鄰接矩陣表示法 #define MaxVertexNum 100 /* 最大頂點數設為100 */ #define INFINITY 65535 /* ∞設為雙位元組無符號整數的最大值65535*/ typedef int Vertex;
第十一週 【專案2-操作用鄰接表儲存的圖】
/* *Copyright (c)2017,煙臺大學計算機與控制工程學院 *All rights reservrd. *作者:趙楷文 *完成時間:2017年11月09日 *版本號:v1.0 *問題描述:假
求圖的鄰接表表示法的單源最短路徑 Dijkstra演算法
要求帶權有向圖中某一頂點到其他各頂點的最短路徑,常用Dijkstra演算法,該演算法基本思想是,先將圖的頂點分為兩個集合,一個為已求出最短路徑的終點集合(開始為原點v1),另一個為還未求出最短路徑的頂點集合(開始為除v1外的全部結點),然後按最短路徑長
資料結構 圖的鄰接表表示轉換成鄰接矩陣表示的演算法
圖的鄰接表表示轉換成鄰接矩陣表示的演算法。 下面這個是有向圖鄰接表表示轉換成鄰接矩陣 #include <stdio.h> #include <string.h> #include <stdlib.h> int a[100][100];
看資料結構寫程式碼(36) 圖的鄰接表表示與實現
圖的鄰接表表示法,是為每一個頂點建立一個連結串列,連結串列裡存放著相同弧尾的 弧的資訊,這些連結串列順序存放在陣列中。下面是無向圖g2的鄰接表 鄰接表 比 鄰接矩陣 節省空間,同時 也帶來一些操作上的 不便,例如 看 兩個頂點是否 相鄰,需要 遍歷 連結串列,在 求 無
圖的鄰接表表示及遍歷
圖也可以用鄰接表表示。各個結點中存放了結點的資訊,並且由一個指標變數,指向第一條邊,第一條變又指向第二條邊,以此類推。圖的鄰接表的程式碼如下: /********************************/ /******圖的鄰接表的建立及遍歷****/ #inclu
Java鄰接表表示加權有向圖,附dijkstra最短路徑演算法
圖這種adt(abstract data type)及相關的演算法,之前一直是我未曾涉足過的領域。 主要是作為一個小測試,在平常的工作中也用不著,就算面試,至今也未曾碰到過相關考題。 但是前幾天,原公司的小美女談到面試過程中就碰到一題: 從A到B,有多條路線,要找出最短路
圖的常用演算法的 python 實現—鄰接表表示法
#圖的鄰接連結串列表示法 graph = {'A': ['B', 'C'], 'B': ['C', 'D'], 'C': ['D'], 'D': ['C','G','H'],
用鄰接表儲存有向圖實現的dfs和bfs
#include<iostream> #include<stdlib.h> #define MAX 20 using namespace std; class ArcNode { public: int adjvex; //儲存弧的終止位置 Ar
圖的鄰接表表示法(C語言)
鄰接表 鄰接表資料結構型別如下: #define MaxVertices 100 typedef struct node{ //邊表 int adjvex; node*
圖的鄰接表表示
描述 圖的表示除了鄰接矩陣表示,還可以使用連結串列陣列。對每個頂點(表頭節點)建立一個單鏈表,第i個單鏈表中節點表示依附於頂點vi 的邊(對有向圖而言,是以頂點vi為尾的弧)。所以在鄰接表中,除了節點外,還有表頭節點。 兩種方法比較 假設圖有V個頂點,E條
圖——鄰接表表示(實現深度優先遍歷、廣度優先遍歷)
程式碼有部分解析:#include<iostream> #include<stdio.h> #include<stdlib.h> #include<iomanip> using namespace std; #define T
深度優先搜尋DFS——圖鄰接表表示
作為圖的一個基本演算法,DFS應用很廣,可以推廣出很多實用的演算法。下面貼出一個比較常用的用鄰接表表示的圖DFS。 /* 圖鄰接表表示DFS input: 1 7 A 1 5 B 2 4 3 C 2 4 2 D 3 6 5 2 E 3 7 4 1 F 1 4 G 1 5