1 #include "stdafx.h" 2 #include <iostream> 3 #include <exception> 4 #include<string> 5 using namespace std; 6 7 typedef char VertexType;//頂點類型 8 typedef int EdgeType;//權值類型 9 const int maxVex = 100; 10 typedef struct EdgeNode//邊表 11 { 12 int adjvex; 13 EdgeType weight; 14 struct EdgeNode *next; 15 }EdgeNode; 16 17 typedef struct VertexNode//頂點表結點 18 { 19 VertexType data; 20 EdgeNode *firstedge; 21 }VertexNode,AdjList[maxVex]; 22 23 typedef struct 24 { 25 AdjList adjList;//含有不少頂點表結點的數組 26 int numVertexes,numEdges;//圖中當前頂點數和邊數. 27 }GraphAdjList; 28 29 void CreateALGraph(GraphAdjList *G) 30 { 31 int i,j,k; 32 EdgeNode *e; 33 34 cout<<"輸入頂點數和邊數:"<<endl; 35 cin>>G->numVertexes>>G->numEdges; 36 37 for(i = 0;i<G->numVertexes;++i)//錄入頂點信息~ 38 { 39 cin>>G->adjList[i].data;//輸入頂點信息 40 G->adjList[i].firstedge=NULL;//將邊表置爲空表 41 } 42 43 for(k= 0 ;k<G->numEdges;k++) 44 { 45 cout<<"輸入邊(vi,vj)上的頂點序號:"<<endl; 46 cin>>i>>j; 47 e=(EdgeNode*)malloc(sizeof(EdgeNode));//生成邊表結點 48 e->adjvex=j; 49 e->next = G->adjList[i].firstedge; 50 G->adjList[i].firstedge=e; 51 e=(EdgeNode*)malloc(sizeof(EdgeNode)); 52 e->adjvex = i ; 53 e->next = G->adjList[j].firstedge; 54 G->adjList[j].firstedge = e; 55 } 56 } 57 58 59 //鄰接矩陣的方式,進行深度優先遍歷 60 61 typedef char VertexType; 62 typedef int EdgeType;//權值類型 63 const int maxVex = 100;//最大頂點數 64 const int inFinity = 65535;//表明無窮大 65 typedef struct 66 { 67 VertexType vexs[maxVex];//頂點表 68 EdgeType arc[maxVex][maxVex];//鄰接矩陣 69 int numVertexes,numEdges;//圖中當前頂點數和邊數 70 }MGraph; 71 typedef int Boolean; 72 Boolean visited[maxVex]; 73 //鄰接矩陣的深度優先遞歸算法 74 void DFS(MGraph G,int i) 75 { 76 int j; 77 visited[i] = true; 78 cout<<G.vexs[i]<<endl;//輸出這個頂點 79 for(j = 0;j<G.numVertexes;j++) 80 if(G.arc[i][j] ==1 &&!visited[j]) 81 DFS(G,j);//對訪問的鄰接頂點進行遞歸調用 82 } 83 84 void DFSTraverse(MGraph G) 85 { 86 int i; 87 for(i = 0;i < G.numVertexes;i++) 88 visited[i] = false;//初始化全部頂點狀態都是未訪問狀態 89 for(i = 0;i < G.numVertexes;i++) 90 if(!visited[i]) //對未訪問過的頂點調用DFS.如果連通圖,只會 91 DFS(G,i); 92 } 93 94 //鄰接表的深度優先遞歸算法 95 void DFSAdj(GraphAdjList *GL,int i) 96 { 97 EdgeNode *p; 98 visited[i] = true; 99 cout<<"輸出這個頂點的值:"<<GL->adjList[i].data<<endl; 100 p = GL->adjList[i].firstedge; 101 while(p) 102 { 103 if(!visited[p->adjvex]) 104 DFSAdj(GL,p->adjvex); 105 p = p->next; 106 } 107 } 108 109 void DFSTraverseAdj(GraphAdjList *GL) 110 { 111 int i; 112 for(i = 0;i<GL->numVertexes;i++) 113 visited[i] = false; 114 for(i = 0;i<GL->numVertexes;i++) 115 if(!visited[i]) 116 DFSAdj(GL,i); 117 } 118 int _tmain(int argc, _TCHAR* argv[]) 119 { 120 121 122 return 0 ; 123 }