C语言课程设计报告_图的遍历的演示
#define M 20
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
/*定义图*/
typedef struct{
int V[M];
int R[M][M];
int vexnum;
}Graph;
/*创建图*/
void creatgraph(Graph *g,int n)
{
int i,j,r1,r2;
g->vexnum=n;
/*顶点用i表示*/
for(i=1;i<=n;i++)
{
g->V[i]=i;
}
/*初始化R*/
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
g->R[i][j]=0;
}
/*输入R*/
printf("Please input R(0,0 END):\n");
scanf("%d,%d",&r1,&r2);
while(r1!=0&&r2!=0)
{
g->R[r1][r2]=1;
g->R[r2][r1]=1;
scanf("%d,%d",&r1,&r2);
}
}
/*打印图的邻接矩阵*/
void printgraph(Graph *g)
{
int i,j;
for(i=1;i<=g->vexnum;i++)
{ for(j=1;j<=g->vexnum;j++)
{
printf("%2d ",g->R[i][j]);
}
printf("\n");
}
}
/*全局变量:访问标志数组*/
int visited[M];
/*访问顶点*/
void visitvex(Graph *g,int vex)
{
printf("%d ",g->V[vex]);
}
/*获取第一个未被访问的邻接节点*/
int firstadjvex(Graph *g,int vex)
{
int w,i;
for(i=1;i<=g->vexnum;i++)
{
if(g->R[vex][i]==1&&visited[i]==0)
{
w=i;
break;
}
else
{
w=0;
}
}
return w;
}
/*获取下一个未被访问的邻接节点(深度遍历)*/
int nextadjvex(Graph *g,int vex,int w)
{
int t;
t=firstadjvex(g,w);
return t;
}
/*深度递归遍历*/
void dfs(Graph *g,int vex)
{
int w;
visited[vex]=1;
visitvex(g,vex);
for(w=firstadjvex(g,vex);w>0;w=nextadjvex(g,vex,w))
if(!visited[w])
{
dfs(g,w);
}
}