最近在学数据结构,自己实现了下图的邻接矩阵实现,对于邻接表实现方法类似,此处把代码贴上:
//"MyGraph.h"
#include <iostream>
#include <queue>
using namespace std;
typedef char VertexType; //顶点类型,用户自定义
typedef int EdgeType; //边上权值类型,用户自定义
#define MAXVEX 100 //最大顶点数,用户自定义
#define INFINITY 65535 //用65535代表无穷大
typedef struct{
VertexType vex[MAXVEX]; //顶点表
EdgeType arc[MAXVEX][MAXVEX]; //邻接矩阵,可看做边表
int numVextexes,numEdges; //图中当前顶点数和边数
}MGraph;
void CreateMGraph(MGraph* pGraph); //创建图
void DFS(MGraph G,int i); //图DFS递归算法
void DFSTraverse(MGraph G); //图DFS遍历
void BFSTraverse(MGraph G); //图BFS遍历
<pre name="code" class="cpp">//"MyGraph.cpp"
#include "stdafx.h"
#include "MyGraph.h"
bool visited[MAXVEX];
//建立无向网图的邻接矩阵表示
void CreateMGraph(MGraph* pGraph)
{
int i,j,k,w;
printf("输入图的顶点数和边数:\n");
//scanf("%d,%d",&pGraph->numVextexes,&pGraph->numEdges);
cin>>pGraph->numVextexes>>pGraph->numEdges;
for(i = 0; i < pGraph->numVextexes; i++)
//scanf("%c",&pGraph->vex[i]);
cin>>pGraph->vex[i];
for(i = 0; i < pGraph->numVextexes; i++)
for(j = 0; j < pGraph->numVextexes; j++)
{
if(i == j)
pGraph->arc[i][j] = 0;
else
pGraph->arc[i][j] = INFINITY; //初始化边表
}
for(k = 0; k < pGraph->numEdges; k++)
{
printf("输入边(Vi,Vj)的下标i,下标j和权w:\n");
//scanf("%d,%d,%d",&i,&j,&w);
cin>>i>>j>>w;
pGraph->arc[i][j] = w;
pGraph->arc[j][i] = w; //无向图,矩阵对称
}
}
//邻接矩阵的深度优先遍历递归算法
void DFS(MGraph G,int i)
{
int j;
visited[i] = true;
printf("%c",G.vex[i]); //打印此节点
for(j = 0; j < G.numVextexes; j++)
{
if(G.arc[i][j] == 1 && !visited[j])
DFS(G,j);
}
}
//邻接矩阵深度优先遍历操作
void DFSTraverse(MGraph G)
{
int i;
for(i = 0; i < G.numVextexes; i++)
visited[i] = false;
for(i = 0; i < G.numVextexes; i++)
{
if(!visited[i]) //对未访问过的点执行DFS,若是连通图,则只执行一次
DFS(G,i);
}
}
//邻接矩阵的广度优先遍历算法
void BFSTraverse(MGraph G)
{
queue<char> myQueue;
for(int i = 0; i < G.numVextexes;i++)
visited[i] = false;
for(int i = 0; i < G.numVextexes; i++) //对每一个顶点做循环
{
if(!visited[i])
{
visited[i] = true;
cout<<G.vex[i];
myQueue.push(G.vex[i]); //将此顶点入队列
while(!myQueue.empty())
{
myQueue.pop();//将队头出队
for(int j = 0; j < G.numVextexes; j++)
if(G.arc[i][j] == 1 && !visited[j])//判断其他顶点若与当前点存在边且未访问过
{
visited[j]=true;
cout<<G.vex[j]; //打印
myQueue.push(G.vex[j]);
}
}
}
}
}
// Graph.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "MyGraph.h"
int _tmain(int argc, _TCHAR* argv[])
{
MGraph myGraph;
CreateMGraph(&myGraph);
DFSTraverse(myGraph);
BFSTraverse(myGraph);
return 0;
}