您的位置:首页 > 编程语言 > C语言/C++

图的创建,深度优先遍历,广度优先遍历。

2016-06-01 00:00 651 查看
摘要: 常用的储存结构有,邻接表,邻接多重表,十字链表。

#include
#include
#include
#define INFINITY INT_MAX	//最大值
#define MAX_VERTEX_NUM 20 //最大顶点数
#define MAX 5

typedef int VRType;
typedef int InfoType;
typedef int VertexType;
typedef int GraphKind;
typedef int Status;
typedef int QElemType;

图的储存结构:

typedef struct ArcCell{
VRType adj;//定点关系类型。对无权图用1或0
//表示相邻否,对带权图则为权值类型。
InfoType *info;//该弧相关信息的指针
} ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct{

VertexType vexs[MAX_VERTEX_NUM];//顶点向量
AdjMatrix arcs;					//邻接矩阵
int vexnum,arcnum;				//图的当前顶点数和弧数
GraphKind kind;					//图的种类标志
}MGraph;

由于广度优先需要用到队列关于队列部分:队列的链式储存以及循环队列

图的常用函数:

Status CreateGraph(MGraph *G){
int IncInfo;
//采用数组邻接矩阵法,构造无向网G。
printf("请输入顶点数,弧数,和其他信息");
scanf("%d,%d,%d",&G->vexnum,&G->arcnum,&IncInfo);//incinfo为0则各弧不含其它信息
int i;int j;int k;
for(i=0;ivexnum;++i)
{
printf("请输入顶点向量");
scanf("%d",&G->vexs[i]);//构造顶点向量

}

for(i=0;ivexnum;++i)		//	初始化邻接矩阵
{
for(j=0;jvexnum;++j)
{
G->arcs[i][j].adj=INFINITY;
}
}
int LocateVex(int v)//输出v所在的位置
{

int z;
for(z=0;zvexnum;++z)
{
if(G->vexs[z]==v){return z;}
}
}

for(k=0;karcnum;++k)//构造邻接矩阵
{

int v1,v2,w;
printf("\n输入第%d条边依附的顶点和权值\n",k+1);
scanf("%d,%d,%d",&v1,&v2,&w);//输入一条边依附的顶点和权值
int i=LocateVex(v1);int j=LocateVex(v2);
G->arcs[i][j].adj=w;  //此处出现数组越界异常 /已解决异常
if(IncInfo){printf("请输入其它信息");}
G->arcs[j][i]=G->arcs[i][j];
}
return 1;
}
//为了简化使用全局变量,不使用指针
int visited[MAX];
Status VisitFunc(int v)
{
printf("%d\t",v);
}
Status FirstAdjVex(MGraph g, int i)  //用来找出第一个节点
{
int k;
if(i>=1 && i<=g.vexnum)
for(k=1; k<=g.vexnum; k++)
if(g.arcs[i][k].adj!=INFINITY)
return k;
return -1;
}
Status NextAdjVex(MGraph g, int i, int j)  //用来找出下一个节点
{
int k;
if(i>=1 && i<=g.vexnum && j>=1 && j<=g.vexnum)
for(k=j+1; k<=g.vexnum; k++)
if(g.arcs[i][k].adj!=INFINITY)
return k;
return -1;
}
void DFS_(MGraph G,int v)
{//从第v个顶点出发递归的深度优先遍历图G。
int w;
visited[v]=1; VisitFunc(v);//访问第v个顶点
for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
if(!visited[w])DFS_(G,w);
}
void DFSTraverse(MGraph G)
{
int v;
for(v=0;v=0;w=NextAdjVex(G,u,w))
if(!visited[w]){		//w为v尚未访问的临界点
visited[w]=1; VisitFunc(w);
EnQueue(&Q,w);
}
}
}
}

测试函数:

main()
{

MGraph G;
CreateGraph(&G);
printf("\n深度优先遍历图G:");
DFSTraverse(G);
printf("\n");
printf("\n广度优先遍历图G:");
BFSTraverse(G);
printf("\n");
}

结果截图:



参考书:数据结构
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息