#include <stdio.h>#include <stdlib.h>#define OK 1#define ERROR -1#define OVERFLOW 0#define MAXVER 20 //定義最大定點數#define MAXINT 200 //定義無窮大typedef enum{UDG,UDN,DG,DN} GraphKind;// 定義無向圖 無向網 有向圖 有向網typedef char verType; //定義頂點類型typedef int status ;typedef struct {verType verx[MAXINT]; //定義頂點 int arcs[MAXVER][MAXVER]; //定義弧int vernum,arcsnum;//定義最大頂點數 和弧GraphKind kind; //類別}MGraph;int visited[MAXVER]={0}; //頂點剛開始都沒被訪問過 //尋找頂點在數組中的下標int locate(MGraph G,verType ch){int i; for(i=0;i<G.vernum&&ch!=G.verx[i];i++);return i;}//建立無向網status createUDN(MGraph &G,int &v){int i,j,w,k;verType ch1,ch2;printf("請輸入無向網的頂點數和弧數:格式如2 3\n");scanf("%d%d",&G.vernum,&G.arcsnum); fflush(stdin);printf("請輸入頂點符號:\n");for(i=0;i<G.vernum;i++){scanf("%c",&G.verx[i]);fflush(stdin);}for(i=0;i<G.vernum;i++){for(j=0;j<G.vernum;j++)G.arcs[i][j]=MAXINT; //賦初值為無窮大}printf(" 請輸入頂點符號和權值:格式A B 3\\n \n");for(i=0;i<G.arcsnum;i++){printf("請輸入第%d對值\n",i+1);scanf("%c %c %d",&ch1,&ch2,&w); //輸入頂點符號和權值fflush(stdin); k=locate(G,ch1); //獲得頂點下標j=locate(G,ch2);G.arcs[k][j]=w; //為臨界矩陣賦值G.arcs[j][k]=G.arcs[k][j]; //無向圖為對稱矩陣}return OK;}//建立有向網status createDN(MGraph &G,int &v){int i,j,w,k;verType ch1,ch2;printf("請輸入有向網的頂點數和弧數:格式如2 3\n");scanf("%d%d",&G.vernum,&G.arcsnum); // 頂點數和弧數輸入fflush(stdin); //清除斷行符號printf("請輸入頂點符號:\n");for(i=0;i<G.vernum;i++){scanf("%c",&G.verx[i]); //頂點符號輸入fflush(stdin);}for(i=0;i<G.vernum;i++){for(j=0;j<G.vernum;j++)G.arcs[i][j]=MAXINT; //賦初值為無窮大}printf(" 請輸入頂點符號和權值:格式A B 3\\n \n");for(i=0;i<G.arcsnum;i++){printf("請輸入第%d對值\n",i+1);scanf("%c %c %d",&ch1,&ch2,&w); //輸入頂點符號和權值fflush(stdin); k=locate(G,ch1); //獲得頂點下標j=locate(G,ch2);G.arcs[k][j]=w; //為臨界矩陣賦值//G.arcs[j][k]=G.arcs[k][j]; //無向圖為對稱矩陣}return OK;}//進行深度優先遍曆void DFS(MGraph G,int v){ //參數 1 圖 2傳遞進來下標 int i; printf("%c ",G.verx[v]); visited[v]=1;for(i=0;i<G.vernum;i++)if(visited[i]==0 && G.arcs[v][i]<MAXINT){ //類型的判斷 是否被訪問過 是否是權值或邊 DFS(G,i);}}//進行圖的遍曆void DFSTravers(MGraph G){ int i;for(i=0;i<G.vernum;i++){ visited[i]=0;}for(i=0;i<G.vernum;i++){ if(visited[i]==0)DFS(G,i);}}int main(){MGraph G;int v=0;if(createUDN(G,v)){//建立無向圖printf("遍曆結果為:\n"); DFSTravers(G); //進行無向圖的遍曆}if(createDN(G,v)){//建立有向圖printf("遍曆結果為:\n"); DFSTravers(G); //進行有向圖的遍曆}return 0;}