1. 程式人生 > >數據結構--實驗3--圖的操作

數據結構--實驗3--圖的操作

菜單項 text 遍歷 div 尾指針 efi 設置 -- std

  1 #include "stdio.h"
  2 #define  MaxVertexNum 20     //定義圖的最大頂點數
  3 #define  MaxEdgeNum  50      //定義圖的最大邊數
  4 #define  MaxValue  1000      //定義MaxValue為全局整型常量,作為無窮大
  5 typedef  int  VertexType;    //定義圖中頂點數據的類型VertexType為整型
  6 typedef  VertexType  vexlist[MaxVertexNum];  //為存儲頂點信息的數組類型
  7 typedef  int adjmatrix[MaxVertexNum][MaxVertexNum]; //
為存儲鄰接矩陣的數組類型 8 int n; //實際的頂點個數 9 int e; //實際的邊個數 10 int visited [ MaxVertexNum ]; //全局數組標記置1表示已經訪問,0為未訪問 11 /* 建立圖的鄰接矩陣 12 通過從鍵盤上輸入n個頂點信息和e條無向帶權邊的信息,建立鄰接矩陣GA*/ 13 void Create(vexlist GV,adjmatrix GA,int n,int e) 14 { 15 int i , j, k, w; 16 printf ("\n 請輸入 %d 個頂點數據", n); //
建立頂點數組 17 for (i=1; i<=n; i++) GV[i]=i; 18 for (i=1; i<=n; i++) /*初始化鄰接矩陣數組*/ 19 for (j=1; j<=n; j++) 20 GA[ i ][ j ]=MaxValue; 21 printf ("輸入 %d 條無向帶權邊\n", e); /*建立鄰接矩陣數組*/ 22 for (k=1; k<=e; k++) 23 { 24 printf("輸入第 %d 條邊的兩端序號及權值(i j W):
",k); 25 scanf ("%d%d%d", &i, &j, &w); 26 GA[i][j]=GA[j][i]=w; //置數組中相應對稱元素的值為w 27 } 28 } 29 30 //鄰接矩陣的深度遍歷 31 void dfs(vexlist GV,adjmatrix GA,int i) // 從頂點i出發的深度遍歷 32 { int j; 33 printf("%d,",GV[i]); //輸出訪問頂點 34 visited[i]=1; //全局數組訪問標記置1表示已經訪問 35 for(j=1; j<=n; j++) 36 if ((GA[i][j]!=MaxValue)&&(!visited[j])) 37 dfs(GV,GA,j); 38 } 39 40 //鄰接矩陣的廣度遍歷 41 void bfs(vexlist GV,adjmatrix GA,int i) //從頂點i出發廣度遍歷 42 { int q[MaxVertexNum] ; //Q為隊列 43 int f,r,j ; // f,r分別為隊列頭,尾指針 44 f=r=0 ; //設置空隊列 45 printf("%d,",GV[i]); // 輸出訪問頂點 46 visited[i]=1; //全局數組標記置1表示已經訪問 47 r++; q[r]=i ; //入隊列 48 while (f<r) 49 { f++; i=q[f] ; //出隊列 50 for (j=1; j<=n; j++) 51 if ((GA[i][j]!=MaxValue)&&(!visited[j])) 52 { printf("%d,",GV[j]); 53 visited[j]=1 ; 54 r++; q[r]=j; 55 } 56 } 57 } 58 59 void print(adjmatrix GA) 60 { 61 62 int i,j; 63 for(i=1;i<=n;i++) 64 { 65 for(j=1;j<=n;j++) 66 67 printf("%d ",GA[i][j]); 68 printf("\n"); 69 } 70 71 } 72 73 void main() 74 { 75 vexlist GV; 76 adjmatrix GA; 77 int i,k,j; 78 do 79 { 80 printf("\n\n\n\n"); 81 printf("\t\t 圖的鄰接矩陣子系統\n"); 82 printf("\t\t*****************************\n"); 83 printf("\t\t* 1----更 新 圖    *\n"); 84 printf("\t\t* 2----深度遍歷    *\n"); 85 printf("\t\t* 3----廣度遍歷    *\n"); 86 printf("\t\t* 0----返  回    *\n"); 87 printf("\t\t*****************************\n"); 88 printf("\t\t 請選擇菜單項(0-3):"); 89 scanf("%d",&k); 90 switch(k) 91 { 92 case 1: 93 printf ("\n請輸入圖的頂點的個數n= "); 94 scanf("%d",&n); 95 printf ("請輸入圖的邊個數e= "); 96 scanf("%d",&e); 97 Create(GV,GA,n,e); 98 printf("圖的鄰接矩陣如下\n"); 99 print(GA); 100 break; 101 case 2: 102 for (i=0; i< MaxVertexNum; i++) /*標誌向量初始化*/ 103 visited [i]=0; 104 printf ("\n請輸入從圖的哪個頂點(1-%d)開始深度遍歷:",j); 105 scanf("%d",&j); 106 printf("深度遍歷的結果為:"); 107 dfs(GV,GA,j); 108 break; 109 case 3: 110 for (i=0; i< MaxVertexNum; i++) /*標誌向量初始化*/ 111 visited [i]=1; 112 printf ("\n請輸入從圖的哪個頂點(1-%d)開始廣度遍歷:",j); 113 scanf("%d",&j); 114 printf("廣度遍歷的結果為:"); 115 bfs(GV,GA,j); 116 break; 117 } 118 }while (k!=0); 119 }

數據結構--實驗3--圖的操作