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 }