将上篇内容改成了C++版本,为了直接使用queue这个容器,只是为了自学而敲的
//#include <stdio.h>
#include <iostream>
#include <string>
#include <queue>
//#include <stdlib.h>
//#include <curses.h>
using namespace std;
typedef char VertexType; //顶点类型用户自定义
typedef int EdgeType; //边上的权值类型用户自定义
#define MAXVEX 100 //最大顶点数
#define INFINITY 65535 //代表无穷大,用来表示不存在的边的权值为无穷大
#define DEBUG
#define MAXVEX 100
typedef int Boolean;
Boolean visited[MAXVEX];
#define TRUE 1
#define FALSE 0
typedef struct
{
VertexType vexs[MAXVEX]; //顶点
EdgeType arc[MAXVEX][MAXVEX]; //邻接矩阵
int numVertexes, numEdges; //顶点数,边数
}Graph;
//定位???
int locates(Graph *g, char ch)
{
int i = 0;
for(i=0; i<g->numVertexes; i++){
if(g->vexs[i]==ch){
break;
}
}
if(i>g->numVertexes){
return -1;
}
return i;
}
void CreatGraph(Graph *g)
{
int i, j, k, w;
//printf("input num of vertexs, edges:\n");
cout<<"input num of vertexs, edges:"<<endl;
//scanf("%d, %d", &(g->numVertexes), &(g->numEdges));
cin>>g->numVertexes>>g->numEdges;
#ifdef DEBUG
//printf("%d %d\n", g->numVertexes, g->numEdges);
cout<<g->numVertexes<<' '<<g->numEdges<<endl;
#endif
for(i = 0; i <g->numVertexes;i++)
{
g->vexs[i] = getchar();
//没看懂啊
while(g->vexs[i]=='\n'){
g->vexs[i] = getchar();
}
}
#ifdef DEBUG
for(i = 0; i < g->numVertexes; i++){
//printf("%c ", g->vexs[i]);
cout<<g->vexs[i]<<' ';
}
//printf("\n");
cout<<endl;
#endif
for(i = 0; i <g->numVertexes;i++){
for(j=0; j<g->numVertexes;j++){
if(i==j)
g->arc[i][j]=0;
g->arc[i][j]=INFINITY; //邻接矩阵初始化为无穷大
}
}
for(k = 0; k<g->numEdges; k++){
char p,q;
//printf("input i , j of (vi, vj) and weight:\n");
cout<<"input i, j of (vi,vj) and weight:"<<endl;
p =getchar();
while(p=='\n'){
p=getchar();
}
q=getchar();
while(q=='\n'){
q=getchar();
}
//scanf("%d",&w);
cin>>w;
int m=-1;
int n=-1;
m=locates(g,p);
n=locates(g,q);
if(m==-1||n==-1)
{
fprintf(stderr, "there is no this vertex.\n");
return ;
}
g->arc[m][n]=w;
//没有以下这句话就是有向图了
g->arc[n][m]=g->arc[m][n]; //无向图,所以是对称的
}
}
//打印无向图
void printGraph(Graph *g)
{
int i , j;
for(i = 0; i<g->numVertexes;i++){
for(j=0; j<g->numVertexes;j++){
//printf("%10d ",g->arc[i][j]);
cout<<g->arc[i][j]<<' ';
}
//printf("\n");
cout<<endl;
}
}
//邻接矩阵的深度优先算法
void DFS(Graph *g, int i)
{
int j;
visited[i] =TRUE;
//printf("%c ", g->vexs[i]);
cout<<g->vexs[i]<<endl;
for(j = 0; j < g->numVertexes; j++){
//已经确定没有关系的两定点之间权值用无限大表示
if(g->arc[i][j]!=65535&&!visited[j]){
DFS(g,j);
}
}
}
//邻接矩阵的深度遍历操作
void DFSTraverse(Graph *g)
{
int i;
for(i = 0; i<g->numVertexes;i++){
visited[i]=FALSE;
}
for(i = 0; i<g->numVertexes;i++){
if(!visited[i]){
DFS(g,i);
}
}
}
void BFSTraverse(Graph *g)
{
int i,j;
queue<char> q;
for(i = 0; i<g->numVertexes;i++){
visited[i]=FALSE;//初始化
}
//InitQueue(&q);
for(i=0;i<g->numVertexes;i++){
if(!visited[i]){
visited[i]=TRUE;
//printf("%c ",g->vexs[i]);
cout<<g->vexs[i]<<endl;
//EnQueue(&q,i);
q.push(i);
//while(!QueueEmpty(q)){
while(!q.empty()){
int m;
//Dequeue(&q,&m);
m=q.front();
q.pop();
for(j=0;j<g->numVertexes;j++){
if(g->arc[m][j]!=65535&&!visited[j]){
visited[j]=TRUE;
//printf("%c ",g->vexs[j]);
cout<<g->vexs[j]<<endl;
//Enqueue(&q,j);
q.push(j);
}
}
}
}
}
}
int main(int argc, char ** argv)
{
Graph g;
CreatGraph(&g);
/*g.numVertexes = 5;
g.numEdges=6;
g.vexs[0]=0;
g.vexs[1]=1;
g.vexs[2]=2;
g.vexs[3]=3;
g.vexs[4]=4;
g.vexs[5]={'0'};
g.arc[5][5] = {65535};
//g.arc[5][5]={65535,65535,65535,65535,6,9,65535,3,65535,65535,2,65535,65535,5,65535,65535,65535,65535,65535,1};
*/
cout<<"DFS:"<<endl;
DFSTraverse(&g);
//printf("\n");
cout<<endl;
cout<<"BFS:"<<endl;
BFSTraverse(&g);
//printGraph(&g);
return 0;
}
这是在网上找的一个示例图,接下来我们的输入按照这个来进行,下图是运行结果