1. 程式人生 > >用鄰接表實現無向圖的建立與輸出

用鄰接表實現無向圖的建立與輸出

 1 #include<stdio.h>
 2 #include <iostream>
 3 #include<algorithm>
 4 using namespace std;
 5 #define MVNum 100
 6 typedef struct ArcNode // 邊表結點
 7 {
 8     int adjvex;    // 鄰接點域,儲存該頂點對應的下標
 9     //int info;      //用於儲存權值,對於非網圖可以不需要
10     struct ArcNode *nextarc; // 鏈域,指向下一個鄰接點
11 }ArcNode;
12 typedef struct VNode // 頂點表結點 13 { 14 char data; // 頂點域,儲存頂點資訊 15 ArcNode *firstarc; // 邊表頭指標 16 }VNode, AdjList[MVNum]; 17 typedef struct 18 { 19 AdjList vertices; 20 int vexnum,arcnum; // 圖中當前頂點數和邊數 21 }ALGraph; 22 23 int LocateVex(ALGraph &G,char v)//找到v在鄰接表G中的位置 24 { 25 for(int i=0
;i<G.vexnum;i++) 26 { 27 if(G.vertices[i].data==v) 28 return i; 29 } 30 return -1; 31 } 32 void CreateALGraph(ALGraph &G) 33 { 34 int i,j,k,v; 35 char v1,v2; 36 ArcNode *p1,*p2; 37 scanf("%d%d",&G.vexnum,&G.arcnum); // 輸入頂點數和邊數 38 for(v = 0
;v < G.vexnum;v++) // 讀入頂點資訊,建立頂點表 39 { 40 scanf("%s",&G.vertices[v].data); // 輸入頂點資訊 41 G.vertices[v].firstarc=NULL; // 將邊表置為空表 42 } 43 getchar(); 44 for(k = 0;k < G.arcnum;k++)// 建立邊表 45 { 46 scanf("%c %c",&v1,&v2); 47 getchar(); 48 i=LocateVex(G,v1); 49 j=LocateVex(G,v2); 50 p1=new ArcNode; // 向記憶體申請空間,生成邊表結點 51 p1->adjvex=j; // 鄰接序號為j 52 p1->nextarc=G.vertices[i].firstarc; //將e的指標指向當前頂點上指向的結點 53 G.vertices[i].firstarc=p1; // 將當前頂點的指標指向e 54 55 p2=new ArcNode; // 向記憶體申請空間,生成邊表結點 56 p2->adjvex=i; //鄰接序號為i 57 p2->nextarc=G.vertices[j].firstarc; // 將e的指標指向當前頂點上指向的結點 58 G.vertices[j].firstarc=p2; // 將當前頂點的指標指向e 59 } 60 } 61 void DispGraphAdjList(ALGraph &G) 62 { 63 int i; 64 ArcNode *p; 65 for(i=0;i< G.vexnum;i++) 66 { 67 printf("%c",G.vertices[i].data); 68 for(p=G.vertices[i].firstarc;p!=NULL;p=p->nextarc) 69 printf("->%c",p->adjvex+'A'); 70 printf("\n"); 71 } 72 } 73 int main(void) 74 { 75 ALGraph G; 76 CreateALGraph(G); 77 DispGraphAdjList(G); 78 return 0; 79 }

如上圖所示的無向圖(鄰接表建立):

輸入:

8 9
A B C D E F G H
A B
B D
B E
E F
D F
A C
C G
C H
G H

輸出:

A->C->B
B->E->D->A
C->H->G->A
D->F->B
E->F->B
F->D->E
G->H->C
H->G->C