这一个程序写了好久,主要是对三个结构体同时操作时出现混乱。
本程序主要是关于图的创建和图的深度优先遍历DFS 和 广度优先遍历BFS。
其中,我把每个节点从a到z分别命名。这程序的输入是一个矩阵,如下:
0 11 0
11 0 13
0 13 0
由这个矩阵的对称性可以看出,它是一个无向图,当然本程序也可以处理有向图。
程序里,我是用邻接法来建立图的。有兴趣的朋友可以试试用 十字链表 来实现有向图,用 邻接多重表 来实现无向图。
但注意,我一开始限制了矩阵的维数为25 ,如需扩大,请修改Max_vertex_num的值。
对了,广度优先遍历我用的是非递归算法,深度优先遍历用的是递归算法,其它两种算法在接下去的日子里,我会补充的。
#include<iostream>
#include<queue>
using namespace std;
typedef int INFOTYPE;
typedef char VERTEXTYPE;
const INFOTYPE Max_vertex_num = 25; //定为25,则矩阵最多只能是25x25
int visited[Max_vertex_num];
typedef struct ArcNode
{
int adjvex; //这条弧的下一个结点
struct ArcNode *nextarc;
INFOTYPE info; //弧上的数据
}ArcNode;
typedef struct VNode
{
VERTEXTYPE data; //结点的数据
ArcNode *firstarc; //与之连接的第一个链结点
}VNode, AdjList[Max_vertex_num];
typedef struct
{
AdjList vertices;
int vexnum,arcnum;
int kind; //1表示无向图
}ALGraph ;
//创建(初始化)这个图
void createGraph(ALGraph &graph, INFOTYPE data[Max_vertex_num][Max_vertex_num], int v) //data指传入的矩阵,v指矩阵的维数
{
int i=0,j=0,arcnum=0,flag=1; //flag用来指示是否是无向图,1表示是。
ArcNode *tempArc=NULL,*p=NULL;
graph.vexnum = v;
for(;i < v; i ++)
{
tempArc = (ArcNode*)malloc(sizeof(ArcNode));
graph.vertices[i].firstarc = tempArc;
graph.vertices[i].data = 'a' + i; //给结点编号,从a开始
tempArc->nextarc = NULL;
p = NULL;
for(j = 0; j < v; j ++)
{
if(data[i][j] != 0)
{
arcnum ++;
if(data[j][i] == 0) flag = 0;
tempArc->adjvex = j;
tempArc->info = data[i][j];
if(p) p->nextarc = tempArc;
p = tempArc;
tempArc = tempArc->nextarc;
tempArc = (ArcNode*)malloc(sizeof(struct ArcNode));
tempArc->nextarc = NULL;
}
}
free(tempArc);
}
graph.arcnum = flag?(arcnum/2):arcnum;
graph.kind = flag;
}
//取得下标为i的第一个邻结点
int FirstAdjVex(ALGraph g, int i)
{
return g.vertices[i].firstarc->adjvex;
}
//BFS取得下一个邻结点
int BFS_NextAdjVex(ALGraph g, int i, int w)
{
ArcNode* arc = g.vertices[i].firstarc;
while(arc->adjvex != w)
{
arc = arc->nextarc;
}
if(!arc->nextarc) return -1;
return arc->nextarc->adjvex;
}
//DFS取得下一个邻结点
int DFS_NextAdjVex(ALGraph g, int i)
{
ArcNode* arc = g.vertices[i].firstarc;
//if(!g.vertices[i].firstarc) return -1;
if(visited[arc->adjvex])
{
if(arc->nextarc) return arc->nextarc->adjvex;
return -1;
}
return arc->adjvex;
}
//广度优先遍历
void BFS_traverse(ALGraph graph)
{
int i=0,n=graph.vexnum;
memset(visited,0,n*sizeof(int)); //先设为0,表示未访问过
queue<int> q;
int t,w; //临时变量,在队列操作中使用
for(i=0; i<n; i++)
{
if(!visited[i])
{
visited[i] = 1;
//开始访问
cout<<graph.vertices[i].data<<endl;
q.push(i);
while(!q.empty())
{
t = q.front();
q.pop();
for(w = FirstAdjVex(graph,t); w > 0; w = BFS_NextAdjVex(graph,t,w))
{
if(!visited[w])
{
visited[w] = 1;
//开始访问
cout<<graph.vertices[w].data<<endl;
q.push(w);
}
}
}
}
}
}
//深度优先遍历
void DFS_traverse(ALGraph graph, int v) //v表示选取v结点开始访问
{
}
//深度优先遍历(递归)
void recursion_DFS_traverse(ALGraph graph, int v) //v表示选取v结点开始访问
{
int i=0, n=graph.vexnum, w;
visited[v] = 1;
//开始访问
cout<<graph.vertices[v].data<<endl;
for(w = v; w >= 0; w = DFS_NextAdjVex(graph,w))
{
if(w>=0 && !visited[w]) recursion_DFS_traverse(graph, w);
}
}
//把图打印出来
void printGraph(ALGraph g)
{
int n = g.vexnum, visited[Max_vertex_num];
ArcNode* arc;
memset(visited,0,n*sizeof(int)); //先设为0,表示未访问过
for(int i = 0; i < n; i ++)
{
arc = g.vertices[i].firstarc;
printf("%c->%c", g.vertices[i].data, g.vertices[g.vertices[i].firstarc->adjvex].data);
while(arc->nextarc)
{
printf("->");
arc = arc->nextarc;
printf("%c", g.vertices[arc->adjvex].data);
}
printf("\n");
}
}
int main()
{
int n,i,j;
INFOTYPE data[Max_vertex_num][Max_vertex_num];
ALGraph *graph = (ALGraph*)malloc(sizeof(ALGraph));
cout<<"How many dimensions is the matrix:";
cin>>n;
memset(data,-1,n*n); //假定输入的弧数据不会是-1
//开始输入矩阵
cout<<"Input the matrix:"<<endl;
for(i = 0; i < n; i ++)
for(j = 0; j < n; j ++)
cin>>data[i][j];
createGraph(*graph,data,n);
printGraph(*graph);
BFS_traverse(*graph);
memset(visited,0,n*sizeof(int)); //先设为0,表示未访问过
recursion_DFS_traverse(*graph, 0);
//cout<<graph->vertices[1].firstarc->info;
return 0;
}
分享到:
相关推荐
数据结构中重要的部分之一——图,这里主要完成一个无向无环图的建立,然后进行DFS BFS的遍历,输出结果,初学图和DFS BFS的小伙伴可以来看看噢
实验内容及要求: 用字符文件提供数据建立连通无向图...编写程序,实现DFS与BFS算法,输出DFS与BFS生成树的每条边。(边用顶点序号组成的无序偶表示) 实验目的:掌握图的邻接表存储结构;掌握图的遍历算法与生成树。
使用邻接表结构,进行广度优先搜索、深度优先搜索并生成树或生成森林,并打印树的边
实现无向图的建立,深度优先、广度优先遍历及遍历序列的输出
题在压缩文件中,图是用邻接矩阵做的,刚刚接触图的同学可以看一看
程序用交互方式完成图的邻接矩阵和邻接表的构造,并提供了DFS和BFS算法。
在C环境中使用Bfs,Dfs的遍历算法创建邻接表建立图。
实现无向图的建立,深度优先和广度优先遍历,输出遍历序列
分别以邻接矩阵和邻接表的方式实现图的深度优先搜索、广度优先搜索
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑...
图论编程,包含文件操作,建立图的邻接表,并实现深度优先搜索
设计一个有向图和一个无向图,使用邻接矩阵和邻接表存储结构,完成在这两种存储结构下有向图和无向图的DFS(深度优先遍历)和BFS(广度优先遍历)的操作。 三、实验要求: 1. 根据实验内容编程,画出你所设计的图,...
建立图的邻接表存储结构,输入或存储任意一个无向图,显示图的深度优先搜索遍历路径和广度优先搜索遍历路径。
本文利用C语言实现了简单的二叉树,每个结点只保存一个整数,并且,由于非常简单,树的根结点是确定的,而不是输入的。...建立好二 叉 树以后,分别利用深度优先(DFS)和广度优先(BFS)进行了遍历,
数据结构课程设计的题目,DFS和BFS遍历图。上传的是编译通过的源代码。
本文利用C语言实现了简单的二叉树,每个结点只保存一个整数,并且,由于非常简单,树的根结点是确定的,而不是输入的。...建立好二 叉 树以后,分别利用深度优先(DFS)和广度优先(BFS)进行了遍历,输出结果。
图的建立、深度优先和官渡优先遍历、邻接表输出,对初学数据结构者有一定的帮助
数据结构实验报告 数据结构是计算机科学中的一门基础课程,涵盖了各种数据...* 实验步骤:设计一个有向图和一个无向图,任选一种存储结构,完成有向图和无向图的 DFS(深度优先遍历)和 BFS(广度优先遍历)的操作。
//以vex[]为顶点集,arc[]表示的邻接矩阵建立图 void instVex(int data); //插入顶点 void instArc(int v1,int v2); //插入边 string dfs(int v0,void visit(int& v)); //深度优先遍历 string bfs(int v0,void ...
solve.py 是项目中负责迷宫求解的部分,提供了DFS、BFS、A*三种迷宫求解方案。 生成算法逻辑实现 该部分介绍一下两个迷宫生成算法的主要逻辑。 DFS 生成迷宫 深度搜素算法构建迷宫。我在实现该算法的时候和网络上...