用鄰接表實現無向圖的建立與輸出
阿新 • • 發佈:2018-11-15
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