C語言實現鄰接矩陣建立無向圖&圖的深度優先遍歷
阿新 • • 發佈:2018-12-22
/* '鄰接矩陣' 實現無向圖的建立、深度優先遍歷*/ #include <stdio.h> #include <stdlib.h> #define MaxVex 100 //最多頂點個數 #define INFINITY 32768 //表示極大值,即 ∞ #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 typedef char VertexType; //假設頂點資料型別為字元型別 typedef int EdgeType; //對於無權圖,用1或0表示是否相鄰,對帶權圖,則為權值型別 typedef struct { VertexType vertex[MaxVex]; //頂點陣列 EdgeType arcs[MaxVex][MaxVex]; //鄰接矩陣 int vexnum,arcnum; //圖中的頂點數和邊數 }Graph; int visited[MaxVex]; //訪問標誌陣列 /**********************各個子函式的定義*********************/ void init(Graph *G); //初始化鄰接矩陣 int LocateVertex(Graph *G,VertexType v);//求頂點位置函式 int createUDG(Graph *G); //建立一個無向圖 void DepthFirstSearch(Graph G, int i); //圖的深度優先遍歷 void TraverseGraph(Graph G); /**************************主函式*************************/ int main() { Graph G; int choice; while(true) { printf("*****************Please enter your choice*****************\n\n"); printf(" choice 1:Initialization\n"); printf(" choice 2:Create Graph\n"); printf(" choice 3:Depth First Search\n"); printf(" choice 0:exit\n\n"); scanf("%d",&choice); switch(choice) { case 1: init(&G); break; case 2: (createUDG(&G)==1)?printf("Create Graph success.\n"):printf("Create Graph ERROR\n"); break; case 3: printf("圖的深度優先遍歷為: "); TraverseGraph(G); break; case 0: exit(0); break; default: printf("ERROR!!\n"); exit(0); break; } } return 0; } /**********************各個子函式功能的實現*********************/ void init(Graph *G) //初始化鄰接矩陣 { int i,j; printf("請輸入圖的頂點個數和邊數:"); scanf("%d %d",&(G->vexnum),&(G->arcnum));//輸入圖的頂點個數和邊數 for(i=0;i<G->vexnum;i++) //初始化 { for(j=0;j<G->vexnum;j++) { G->arcs[i][j]=INFINITY; } } printf("圖的初始化成功\n"); } int LocateVertex(Graph *G,VertexType v) //查詢並返回頂點的位置 { int j=0,k; for(k=0;k<G->vexnum;k++) { if(G->vertex[k]==v) { j=k; break; } } return j; } int createUDG(Graph *G) //建立一個無向圖 { int i,j,k,weight; VertexType v1,v2; for(i=0;i<G->vexnum;i++) { printf("請輸入圖的第 %d 頂點:",i+1); getchar(); scanf("%c",&(G->vertex[i])); //輸入圖的頂點集 } for(k=0;k<G->arcnum;k++) { printf("請分別輸入圖的第 %d 條邊的兩個頂點和權值",k+1); getchar(); scanf("%c %c %d",&v1,&v2,&weight);//輸入一條邊的兩個頂點、權值 i=LocateVertex(G,v1); j=LocateVertex(G,v2); G->arcs[i][j]=weight; //建立頂點之間的關係 G->arcs[j][i]=weight; } return OK; } void DepthFirstSearch(Graph G, int i) //圖的深度優先遍歷 { int j; visited[i] = TRUE; printf("%c ",G.vertex[i]); for (j=0; j<G.vexnum; j++) { if (G.arcs[i][j]!=INFINITY && !visited[j]) DepthFirstSearch(G,j); } } void TraverseGraph(Graph G) { int i; for (i=0; i<G.vexnum; i++) //初始化訪問標誌陣列 visited[i] = FALSE; for (i=0; i<G.vexnum; i++)//迴圈呼叫深度優先遍歷連通子圖的操作,若圖G是連通圖,則此呼叫只執行一次 { if (!visited[i]) DepthFirstSearch(G, i); } printf("\n"); }
程式碼測試: